20利率

20利率

题目描述#

为了早日实现买房娶媳妇的梦想,小戴在攒够房子的首付款后一次性地向银行贷款借了a元钱,并约定分b个月还清。如果银行要求每月还贷c元钱,请问月利率x是多少(按照复利计息法计算)?提示:按照复利计息法,第一个月还贷c元钱后还欠银行a(1+x)-c元钱。如果第m个月还贷后还欠银行n元钱,则第m+1个月还贷后还欠银行n(1+x)-c元钱。另外,小明借贷银行,非地下黑钱庄,所以月利率最高不超过100%;当然,天下没有免费的午餐,银行在这笔借贷业务中也不可能亏损,所以月利率最低不低于0%。例如:借2000元,分4个月还清,每月还贷510元,则月利率为0.797%。

输入格式#

输入a(实数) b(整数) c(实数)

输出格式#

输出x(实数,保留三位小数)

样例输入#

2000.0  4  510.0

样例输出#

0.797%

提示/说明#

按照复利计息法,第一个月还贷c元钱后还欠银行a(1+x)-c元钱。如果第m个月还贷后还欠银行n元钱,则第m+1个月还贷后还欠银行n(1+x)-c元钱。另外,小明借贷银行,非地下黑钱庄,所以月利率最高不超过100%;当然,天下没有免费的午餐,银行在这笔借贷业务中也不可能亏损,所以月利率最低不低于0%。

code

#include <bits/stdc++.h>
using namespace std;

//还款规则 a(1+x) - c
// a为欠款,x为利率,c为每月还款
/**
我们可以使用二分法来寻找合适的月利率
?
x。首先,设定一个月利率的范围,例如 0 到 100然后通过二分法不断缩小范围,找到使得最后一个月欠款为0的月利率。
*/
int main() {
	double a,c; //a为借款,c为每月还款
	int b; //还钱的月份
	cin >> a >> b >>c;
	//还款规则 a(1+x) - c

	//现在求x,这里使用二分法
	double low = 0.0;
	double high = 1.0;
	double tolerance = 1.0e-6; //精度上限

	while (high - low > tolerance) { // 精度未超过上限
		double x = (low + high) / 2.0; // 中间的利率 x, 利用二分不断靠近符合要求的利率
		cout <<"low: " << low <<"\thigh: " << high <<"\t利率x: " << x ;
		double remainingLoan = a; //当前还欠下的钱

		for (int i = 0; i < b; ++i) {
			remainingLoan = remainingLoan * (1.0 + x) - c; //还款规则,更新还款后的欠款
		}
		cout <<"\t剩下:"<< remainingLoan << endl;

		//二分
		if (remainingLoan > 0) { //如果还不完,还有欠款,说明利率x太高了,x = low + high / 2要变小一点 ,所以high = x; 
			high = x;
		} else {
			low = x;
		}
	}

	printf("%.3lf%%",low * 100); //返回月利率,保留三位小数
	return 0;
}

视频讲解

作者:daizixuan

出处:https://www.cnblogs.com/daizixuan/p/18009080

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请标明出处

posted @   daizixuan  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示