二分--银行贷款

银行贷款

银行贷款

题意

一人还贷款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 
#include 
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;
} 
 

你可能感兴趣的:(c++)