首页 > 其他分享 >P163 银行贷款

P163 银行贷款

时间:2024-06-06 19:11:53浏览次数:13  
标签:P163 double 银行贷款 mid leq 100 check 利率

题目

银行贷款

题目描述

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

输入格式

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

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

输出格式

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

数据保证答案不超过 $300.0%$。

样例 #1

样例输入 #1

1000 100 12

样例输出 #1

2.9

提示

数据保证,$1 \leq w_0, w\leq 2^{31}-1$,$1 \leq m\leq 3000$。

算法1

(二分) $O(KlogN)$

预备常识****:国家规定月利率不得大于2.5%

1.二分什么:利率
2.二分边界:

//由于国家月利率不得大于2.5%,因此从2.5开始出发
   double l = 0, r = 500;   //(0 + 500) /2 /100 == 2.5
   while(r - l > le-4)  //确定精度,0.1%=0.001 —— le-4
   {
       double mid = (l + r)/2;
       
       //需要思考利率和还钱得关系
       if(check(mid / 100)) l = mid;
       else r = mid;
   }

3.判断依据:当前利率的时候是否能还清贷款

bool check(double x){

    double sum=a;
    
    for(int i=1;i<=c;i++){
    
        sum+=sum*x;    //每月累计利率
        sum-=b;        //每月必须要还的钱
    }
    
    if(sum <= 0) return 1;
    else return 0;
}

C++ 代码

#include <bits/stdc++.h>
using namespace std;

double 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 1;   //当前利率时可以将还清 
	else return 0;         //当前利率时不可以还清 
	
}
int main(){
	
	scanf("%lf%lf%lf",&a,&b,&c);
	
	double l = 0, r = 500;  //由于国家最大利率不超过2.5% 因此从2.5出发(0+500)/2/100-即可得到2.5 
	
	while(r - l > 1e-4){ //确定精度
	  double mid= (l+r)/2;
	  
	  if(check (mid/100))  l=mid;   //还清说明当前利率(在一定的条件下)可以在小点使得还前的数越大 
	  else r=mid;    //还不完了,利率太大了 ,马上把利率降低 
		
	}
	
	printf("%.1lf",l);

	return 0;
	
}

标签:P163,double,银行贷款,mid,leq,100,check,利率
From: https://www.cnblogs.com/ltphy-/p/18235875

相关文章

  • P1163银行贷款
    题目链接:银行贷款-洛谷思路:本题题目表述很迷糊,简单讲解一下,就是一个人去银行贷款,每月要还固定的钱,持续还n个月才能还清,求的是贷款利率;大家可能会想这不是数学题吗,直接上手求解,然后拿样例对比发现和答案对不上,这就是本题坑的地方,这银行是比高利贷还黑,他会把当月的利息加入到......
  • P1637 题解
    一道绿写2.5h,我是什么效率哥。Solution提供一种不使用线段树/树状数组的方法。前置知识:分治,二分,前缀和。考虑分治。我们假设有一个分治函数solve(l,r)可以统计区间\([l,r]\)中的thair。对于一个区间\([l,r]\)中的thair\(=\{a_i,a_j,a_k|i<j<k\) 且\(a_......
  • 银行贷款(二分)
    题目描述当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。输入格式三个用空格隔开的正整数。第一个整数表示贷款的原值 w0​,第二个整数表示每月支付的分期付款金额 w,第三个整数表示......
  • P1638 逛画展
    这道题的双指针筛选区间方式,和蓝桥杯的那个最大公约数一模一样:#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cstring>#include<string.h>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n......
  • 洛谷题单指南-二分查找与二分答案-P1163 银行贷款
    原题链接:https://www.luogu.com.cn/problem/P1163题意解读:利率越小,贷款期限和每个月还的钱固定的情况下,越有可能能够还完全部的贷款,具备单调性,因此给定贷款利率、贷款月数、每月还款钱数,可以计算最终贷款还剩下多少,有两种情况:>=0,说明利率可能大了,要试探更小利率;<0,说明利率小了,要......
  • P1631 序列合并
    题目链接:第一时间想到的思路是将\(a,b\)数组中的\(n^2\)个和全部枚举并压入优先队列中,最后再输出前\(n\)个数,代码如下:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N],b[N];intmain(){ intn; cin>>n; for(inti=0;i<......
  • P1638 逛画展
    原题链接反思,debug不出来就赶紧看题解把!题解双指针,双指针有好几种,这个是像弹簧(窗口)一样的双指针,右指针一直往右走,当成立时,左指针一直往左走直到不成立code#include<bits/stdc++.h>usingnamespacestd;inta[1000006]={0};intmain(){ios::sync_with_stdio(false);......
  • 银行贷款截图生成器,易语言写的
    这是界面:下面是程序集截图:.版本2.程序集窗口程序集_启动窗口.子程序_按钮1_被单击标签1.标题=编辑框1.内容标签2.标题=编辑框2.内容标签3.标题=编辑框3.内容标签4.标题=编辑框4.内容标签5.标题=编辑框5.内容标签1.可视=真标签2.可视=真标签3.可视=真......
  • P1631 序列合并
    P1631序列合并思路思路一题目要求的是二维的,太麻烦,所以我们可以将其用一维划分,将每一组都变成线性的,那线性的就很好求了,直接排序然后从前往后算即可,那么就可以将这\(n\)组合并,但如果是整个都算出来再合并就会是\(O(n^2)\)的,所以可以只记录当前的,那么对于当前的最小的状态,......
  • P1631 序列合并[优先队列]
    P1631序列合并这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。直接贴题解吧题解P1631【序列合并】一共会产生n*n个数,a[1]+b[1]<=a[1]+b[2]........<=a[1......