题目 链接
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
输入输出样例
输入 #1
1000 100 12
输出 #1
2.9
题意分析
首先需要知道公式。。。。
给出n,m,k,求贷款者向银行支付的利率p,使得:
然后代入公式,二分判断合法性,求出答案。
时间复杂度分析
check一次的时间复杂度是O(nk),每次要遍历一次n然后求一次pow。二分的复杂度为logN,所以总的时间复杂度为nk*logN。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
double a[N],b[N];
int n, m, k;
int check(double x) {
double sum = 0;
for (int i = 1; i <= k; i++) {
sum += (m / pow(1 + x / 100, i));
}
return sum >= n;
}
int main() {
// freopen("in.txt", "r", stdin);
cin >> n >> m >> k;
double l = 0, r = 1000;
while (l < r - 1e-6) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.1lf", l);
return 0;
}