P1163 银行贷款

P1163 银行贷款

P1163 银行贷款

题意

1.从银行贷款后,在一段时间内每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
2.三个用空格隔开的正整数。第一个整数表示贷款的原值n,第二个整数表示每月支付的分期付款金额 m,第三个整数表示分期付款还清贷款所需的总月数t。

思路

  1. 先判断题目用什么知识点,例:这题二分。
  2. 理解题意,将实例演示出来。
  3. 注意细节,将实例带到所写的代码中看看能不能实现。

坑点

  1. 数据保证答案不超过300.0%,给l,r定义范围。
  2. 钱多钱少与在二分中间值的左边还是右边要搞搞清楚。
  3. ans>0,还有钱没还清,利润小了,往右边找。ans<0,多还钱了,利润大了所有往左找。

算法一:浮点二分

时间复杂度

输出大小: 1.90697479248047 MiB
编译时间: 1.14s

实现步骤
  1. 首先定义函数,函数里面用二分(模版)解答,n贷款,m分期付款,t月数
  2. 根据题目,在理解题目意思的前提下,用二分法将题意表达出来。
  3. 最后在主函数中应用所定义的函数。
代码
 #include <iostream>
#include <cstdio>
using namespace std;
double n,m,t;//n贷款,m分期付款,t月数 
//double h;
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(l,mid); //相当于r=mid
	}
	if(ans<0){//多还钱了,利润大了所有往左找 
		return find(mid,r);//相当于l=mid 
	}
}
int main(){
//	cin>>n>>m>>t;
    scanf("%lf%lf%lf",&n,&m,&t);
	double h=find(0,5);//数据保证答案不超过300.0%
	//给l,r定义范围
	printf("%.1lf",h*100);
	return 0;
}

总结

浮点二分和二分一样,都要先定义一个函数,再在主函数里运用函数,说白了,唯一不同的就是,数值是一个是浮点型,一个是整型