洛谷题集——银行贷款(暴力枚举与二分查找)

银行贷款

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

输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。

输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。

输入输出样例
输入
1000 100 12
输出
2.9


计算公式
月还款额=本金 * 月利率 * (1+月利率)n/[(1+月利率)n-1]

坑:测试数据会月利率大于1

解法一:银行贷款(暴力枚举)

#include
using namespace std;
int main(){
     
	int total, y_money, y_time;
	scanf("%d%d%d", &total, &y_money, &y_time);
	
	double ans=1;
	for(double i=0.0001; i<=10; i+=0.0001){
     
		double tmp = (total*i*pow(1+i, y_time))/(pow(1+i, y_time)-1);
		if(tmp>y_money){
     
			ans = i-0.0001;
			break;
		}
	}
	ans *= 100;
	printf("%.1lf", ans);
	return 0;
} 

因为答案取值范围较小,可以直接利用暴力枚举的方式枚举出答案,注意要取到小数点后4位,方便四舍五入。


解法二:二分查找
洛谷题集——银行贷款(暴力枚举与二分查找)_第1张图片
如果将 i 看作自变量,n看作因变量时
容易证明,此函数具有单调性。
所以二分枚举 i 的值,再进行判断即可
化简得后,用等比数列的求和公式得
[1/(1+i)]i=1 - n/m * i

化简

#include
using namespace std;
double r, l, total, y_money, y_time;

int main(){
     
	scanf("%lf%lf%lf", &total, &y_money, &y_time);
	r=10, l=0;
	while(r-l>=0.0001){
     //精度
		double mid = (r+l)/2;
		if(pow(1.0/(1.0+mid),y_time)>=1-total/y_money*mid)
			r = mid;
		else
			l = mid;
	}
	l*=100;
	printf("%.1lf", l);
	return 0;
} 

题目简单,但是对于不会计算月利率的同学来说,还是挺麻烦的…

你可能感兴趣的:(基础算法题,二分法,经验分享)