一、贷款利率(loan)
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入文件:
输入文件仅一行包含三个用空格隔开的正整数。
第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。
输出文件:
输出文件应该是一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
Sample Input
1000 100 12
Sample Output
2.9
一开始就想到用二分,感觉范围是0~1。但是突然看到样例是2.9。。吓傻了,结果想了一个小时没想出来。。最后终于发现此2.9乃2.9%,干。
提交次数:2
1、WA60。错误原因有两个,一是0输出了-0,以后记得浮点数要单独考虑0,二十分浪费了。另外,还有二十分是因为精度小了,eps设的1e-3,不够,改成了1e-8
2、AC
#include <cstdio>
#include <cstring>
#include <string>
const double eps = 1e-8;
double a;
double b;
long c;
long getint()
{
long rs=0;char tmp;bool sgn=1;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){sgn=0;tmp=getchar();}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
double work(double m)
{
double tmp = a;
for (long i=1;i<c+1;i++)
{
tmp = tmp*(1+m)-b;
}
return tmp;
}
int main()
{
freopen("loan.in","r",stdin);
freopen("loan.out","w",stdout);
a = getint();
b = getint();
c = getint();
double l = 0;
double r = 1;
double m;
while (l < r + eps)
{
m = (l+r)/2.0;
double re = work(m);
if (re < 0)
{
l = m+eps;
}
else
{
r = m-eps;
}
}
if (m*100.0 < 0)
printf("0.0");
else
printf("%.1lf",m*100.0);
return 0;
}
3372

被折叠的 条评论
为什么被折叠?



