题目链接:银行贷款 - 洛谷
思路:本题题目表述很迷糊,简单讲解一下,就是一个人去银行贷款,每月要还固定的钱,持续还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;
}