浙江工商大学20机试(oj复试)月利率

文章描述了一个计算月利率的问题,小明向银行贷款并按月还款。使用复利计息法,通过二分查找算法寻找满足条件的月利率。程序读入贷款金额、还款月数和每月还款额,输出月利率(保留三位小数)。

月利率

题目描述
为了早日实现买房娶媳妇的梦想,小明在攒够房子的首付款后一次性地向银行贷款借了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%。

思路:
二分用了个零点定理。
这题暂时性放弃了,代码问学弟给的。

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

const int N = 2e5 + 10, mod = 998244353;
double a,c;
int b;
double work(double x) {
	double sum = a;
	for (int i = 0; i < b; ++ i) {
		sum = sum * x - c;
		if (sum < 0) return sum;
	}
	return sum;
}

signed main() {
	cin.tie(0), cout.tie(0)->sync_with_stdio(false);
	int t = 1;
	while (t --) {
		cin >> a >> b >> c;
		double l = 1, r = 2;
		while (abs(l - r) > 0.000000001) {
			double mid = (l + r) / 2;
			double x = work(mid), y = work(l); 
			if (x * y <= 0 || (x > 0 && y > 0)) r = mid;
			else l = mid;
		}
		printf("%.3lf%%\n",(l - 1)*100);
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值