P1163 银行贷款(题目的题解,易理解)

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

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

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

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

输入输出样例

输入
1000 100 12
输出
2.9
这道题是一道典型的二分题
思路:这道题主要就是在那个月利率上,因为国家规定月利率不得大于2.5%,所以我们可以从2.5出发(0+500)/2/100出发,开始使用二分逐步细化,那个check()函数主要是用来判断利率的大小,其中的for循环是用来计算c各月中的欠款和还款情况.
(举例说明:那么对于第 1 个月,他欠银行 a+ax ,但由题意得,他每个月向银行还 b 元钱,所以下个月前还欠银行 a+ax-b;来到第 2 个月,欠银行 (a+ax-b)+(a+ax-b)*x ,还款 b 元,以此类推,直到第 c 个月后,求出他还欠银行的钱数;如果欠的钱数 ≤ 0 ,说明在月利率为 x 的情况下,每月还 b 元是可以还清的,返回 true,反之,返回 false;)

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;
int a,b,c;
bool check(double x){
	double sum=a;
	for(int i=1;i<=c;i++){
		sum+=sum*x;
		sum-=b;
	}
	if(sum<=0){
		return true;
	}else{
		return false;
	}
}
int main(){
	while(scanf("%d %d %d",&a,&b,&c)!=EOF){
		double l,r;
		l=0;
		r=500;
		for(int i=0;i<100;i++){
			double mid=(l+r)/2;
			if(check(mid/100)){
				l=mid;
			}
			else{
				r=mid;
			}
		}
		printf("%.1f\n",l);
	}
}
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值