洛谷[P1163 银行贷款] {二分}
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
输入输出样例
输入
1000 100 12
输出
2.9
解题思路
二分算法求什么就用什么来作为二分的mid值。因此,本题我们将利率作为进行求解的值。
注意
1、本题的利率最大值会达到200%以上,简直就是抢钱啊有木有!!!所以右端点的值至少设置为300以上。
2、注意mid要除100,因为你求的是利率。
3、根据答案要求的值,确定精确值eps的值。
完整代码
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-4;//百分数形式表示,精确到小数点后四位
int main()
{
double m,n,q;
scanf("%lf %lf %lf",&m,&n,&q);
double left=0,right=300;//利率是按照百分数进行处理的,根据测试数据可能达到2.几%,所以右侧边界选择300就可以了
double mid;
while(right-left>eps)//二分确定精确值的模板
{
mid=(left+right)/2;
double ans=m;
for(int i=0;i<q;i++)
{
ans=ans*(1+mid/100)-n;//计算还款之后还剩多少贷款
}
if(ans>eps) right=mid;//如果没有还完贷款,那么说明利率大了,所以更改right
else left=mid;//如果贷款已经还完,说明利率小于等于边界,所以更改left
}
printf("%.1f",left);
return 0;
}