P1163银行贷款

题目链接:银行贷款 - 洛谷

思路:本题题目表述很迷糊,简单讲解一下,就是一个人去银行贷款,每月要还固定的钱,持续还n个月才能还清,求的是贷款利率;大家可能会想这不是数学题吗,直接上手求解,然后拿样例对比发现和答案对不上,

这就是本题坑的地方,这银行是比高利贷还黑,他会把当月的利息加入到借的本金里,下个月产生的利息为(本金+上个月的利息-还的钱)*利率,上例子:贷款了1000,假设利率是300%(题目说的最大不超过),每月还100,本月你所欠银行的钱为:1000+1000*3-100=3900,下个月欠的钱为:3900+3900*3-100,(真黑啊),以此类推直到n个月为止(当然例子是顺便举的,肯定还不完的),

....也就是说会把利息加入本金里来算下个月的利息;

注意:洛谷中的题解,有将r定为5的,题目说的3;也能得出正确答案,这是因为while(r-l>=0.00001)这里他们的精度开的比较小,虽然可以节约运行时间,但不好理解(就像我一样,现在都还不明白)

#include <bits/stdc++.h>
using namespace std;
int maney,x,n;//maney是借的钱,x:每月应该还的,n:持续还的月份
double l,r,mid;
bool check(double mid)//通过验证在该利率下,每月还x月,n月后能否还清贷款来验证二分传来的mid
{
        double sum=maney;
        for(int i=1;i<=n;i++)
        {
                sum+=sum*mid;
                sum-=x; 
        }
        if(sum<=0)
        {
                return true;
        }
        else
        {
                return false;
        }
}
int main()
{
        cin>>maney>>x>>n;
        l=0,r=3;//题目说了最大范围是300%,右边界为3;
        while(r-l>=0.00001)//通过二分来查找答案
        {
                mid=(l+r)/2;
                if(check(mid))
                {
                        l=mid;
                }
                else
                {
                        r=mid;
                }
        }
        cout<<fixed<<setprecision(1)<<mid*100;
        return 0;
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值