P163 银行贷款

题目

银行贷款

题目描述

当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。

输入格式

三个用空格隔开的正整数。

第一个整数表示贷款的原值 $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;
	
}

posted @   LTphy  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示