P1163 银行贷款

银行贷款

题目描述

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

输入格式

三个用空格隔开的正整数。

第一个整数表示贷款的原值 w 0 w_0 w0,第二个整数表示每月支付的分期付款金额 w w w,第三个整数表示分期付款还清贷款所需的总月数 m m m

输出格式

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

数据保证答案不超过 300.0 % 300.0\% 300.0%

样例 #1

样例输入 #1

1000 100 12

样例输出 #1

2.9

提示

数据保证, 1 ≤ w 0 , w ≤ 2 31 − 1 1 \leq w_0, w\leq 2^{31}-1 1w0,w2311 1 ≤ m ≤ 3000 1 \leq m\leq 3000 1m3000

本题的关键点就是在m个月内能还清贷款

二分答案return的一定是个不等号

// Problem: P1163 银行贷款
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1163
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2024-03-27 18:09:34
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
#define ld long double
using namespace std;
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
const int NC = 2e3 + 10;
char ches[NC][NC];
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int a[N], b[N], n, m, k;
ld w0, w,eps = 1e-8;
bool check(ld rate) {
	int cnt = 0;
	ld bg = w0;
	while (bg >= eps) {
		bg = (bg + bg * rate) - w;
		cnt++;
		if (cnt > m)return false;
	}
	return cnt <= m;
}
void solve() {
	cin >> w0 >> w >> m;
	ld l = 0, r = 3,ans = 0;
	while (r - l >= eps) {
		ld mid = (l + r) / 2;
		if (check(mid))ans = mid,l = mid;
		else r = mid;
	}
	ans *= 100;
	cout << fixed << setprecision(1) << ans << endl;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值