P1163 银行贷款
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
题解
看了下算法标签,显示二分查找,那就用二分法吧
答题思路大概是酱紫的:
(贷款的原值a、每月支付的分期付款金额b、分期付款还清贷款所需的总月数t,n表示在t个月后还剩下多少钱没有还)。(根据别人说秦九韶算法)公式看代码就懂了(不想写)。如果n是正数说明利率过大,则从左侧继续二分查找;反之,则从右侧继续二分查找;当n等于零或则精度小于0.0001时,恭喜找到答案。
#include<iostream>
lude<iomanip>
using namespace std;
double a, b;
int t;
void f(double l,double r) {
double n = a;
double k = (l + r) / 2; //二分
if (r - l < 0.0001) { //精度小于0.0001时停止
cout << fixed << setprecision(1) << k * 100; //小数点后一位
return;
}
for (int i = 1; i <= t; i++)
n = n * (1 + k) - b; //
if (n > 0)
f(l, k);
if (n < 0)
f(k, r);
if (n == 0)
cout << fixed << setprecision(1) << k * 100;
}
int main(){
cin >> a >> b >> t;
f(0, 5); //测试点数据中月利率居然能大于1,强
return 0;
}