二分--银行贷款

银行贷款

银行贷款

题意

一人还贷款n元,利润S,时间t,问利润为多少时贷款刚好还清

思路

本题用二分解题
把利润当作mid用二分查找(找到刚好还清贷款的利润)

坑点

  1. 输出mid时有两个条件可满足,不仅是ans==0时输出,当r-l<0.000000001时也可满足(或者关系)
  2. 注意输出时(百分号,点,一,LF)

算法一:二分,递归

实现步骤

. 递归函数find求mid
定义mid,ans为最后所剩的贷款
for循环中ans=ans*(1+利润)–每月还的钱
之后进行判断:
(1)如果ans=0或r-l<0.00001 直接输出
(2)如果ans<0表明贷款还多了,说明mid小了,所有要往右找利润,使得mid变大,也相当于L=mid.因为ans不等于0,所以再进行find递归,使得ans=0,输出mid.
(3)如果ans>0,同上。

代码
#include <iostream>
#include <cstdio>
using namespace std;
double n,m,t;//n贷款,m分期付款,t月数 
double find(double l,double r){
	double mid=(l+r)/2;//表示一开始的利润 
	double ans=n;//ans为剩下的钱 
	for(int i=1;i<=t;i++){
		ans=ans*(1+mid)-m;
    }
    if(ans==0||r-l<0.000001){//保证精准度足够 
    	return mid;
	}
	if(ans<0){//多还钱了,利润大了所有往左找 
		return find(mid,r);//相当于l=mid 
	}
	if(ans>0){//还有钱没还清,利润小了 ,往右边找 
		return find(l,mid); //相当于r=mid
	}
}
int main(){
    scanf("%lf%lf%lf",&n,&m,&t);
	double h=find(0,5);//数据保证答案不超过300.0%
	//给l,r定义范围
	printf("%.1lf",h*100);
	return 0;
} 
 
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值