银行贷款
题意
一人还贷款n元,利润S,时间t,问利润为多少时贷款刚好还清
思路
本题用二分解题
把利润当作mid用二分查找(找到刚好还清贷款的利润)
坑点
- 输出mid时有两个条件可满足,不仅是ans==0时输出,当r-l<0.000000001时也可满足(或者关系)
- 注意输出时(百分号,点,一,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;
}