Loading

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;
}

视频讲解

posted @ 2024-02-06 02:27  daizixuan  阅读(45)  评论(0)    收藏  举报