银行贷款
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值 $w_0$,第二个整数表示每月支付的分期付款金额 $w$,第三个整数表示分期付款还清贷款所需的总月数 $m$。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到 $0.1%$。
数据保证答案不超过 $300.0%$。
样例 #1
样例输入 #1
1000 100 12
样例输出 #1
2.9
提示
数据保证,$1 \leq w_0, w\leq 2^{31}-1$,$1 \leq m\leq 3000$。
算法1
(二分) $O(KlogN)$
预备常识****:国家规定月利率不得大于2.5%
1.二分什么:利率
2.二分边界:
//由于国家月利率不得大于2.5%,因此从2.5开始出发
double l = 0, r = 500; //(0 + 500) /2 /100 == 2.5
while(r - l > le-4) //确定精度,0.1%=0.001 —— le-4
{
double mid = (l + r)/2;
//需要思考利率和还钱得关系
if(check(mid / 100)) l = mid;
else r = mid;
}
3.判断依据:当前利率的时候是否能还清贷款
bool check(double x){
double sum=a;
for(int i=1;i<=c;i++){
sum+=sum*x; //每月累计利率
sum-=b; //每月必须要还的钱
}
if(sum <= 0) return 1;
else return 0;
}
C++ 代码
#include <bits/stdc++.h>
using namespace std;
double a,b,c;
bool check(double x){
double sum=a;
for(int i=1;i<=c;i++){
sum+=sum*x; //每月累加利率
sum-=b; //每月必须还清的钱
}
if(sum<=0) return 1; //当前利率时可以将还清
else return 0; //当前利率时不可以还清
}
int main(){
scanf("%lf%lf%lf",&a,&b,&c);
double l = 0, r = 500; //由于国家最大利率不超过2.5% 因此从2.5出发(0+500)/2/100-即可得到2.5
while(r - l > 1e-4){ //确定精度
double mid= (l+r)/2;
if(check (mid/100)) l=mid; //还清说明当前利率(在一定的条件下)可以在小点使得还前的数越大
else r=mid; //还不完了,利率太大了 ,马上把利率降低
}
printf("%.1lf",l);
return 0;
}
标签:P163,double,银行贷款,mid,leq,100,check,利率 From: https://www.cnblogs.com/ltphy-/p/18235875