华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1487|回复: 3
打印 上一主题 下一主题

P1163 银行贷款

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-14 21:08:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。输入文件仅一行包含三个用空格隔开的正整数。第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。输出一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
  1. #include<iostream>
  2. #include<cmath>
  3. #include<iomanip>
  4. using namespace std;
  5. const long double eps=0.00001;
  6. int s,a,month;
  7. long double f(long double x)
  8. {
  9.     long double sum=s,xx=x;
  10.     for (int i=1; i<=month; i++)
  11.     {
  12.         sum=sum*(1+x);
  13.         sum-=a;
  14.         ///cout<<sum<<' ';
  15.     }
  16.     return sum;
  17. }
  18. int main()
  19. {

  20.     cin>>s>>a>>month;
  21.     long double sum=a*month;
  22.     long double l=0,r=100,m;
  23.     bool b=1;
  24.     while (l<=r  && b)
  25.     {
  26.         m=(l+r)/2;
  27.         ///cout<<l<<' '<<r<<' '<<m<<' '<<f(m)<<' '<<sum<<endl;
  28.         if (abs(l-r)<eps) b=0;
  29.         else if (f(m)>0) r=m-eps;
  30.         else if (f(m)<0) l=m+eps;
  31.         else if (abs(sum-f(m))<eps) b=0;
  32.     }
  33.     m=m*100;
  34.     cout<<fixed<<setprecision(1)<<m;
  35. }
复制代码
回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
地板
发表于 2018-8-25 16:25:51 | 只看该作者
  1. #include<iostream>
  2. #include<cmath>
  3. #include<iomanip>
  4. using namespace std;
  5. int n,a,b,k=1;
  6. typedef double db;
  7. db x,l,r,m,ans;
  8. db eps=0.0001;
  9. db f(db x)
  10. {
  11.     db s=a;
  12.     for(int i=1; i<=n; i++)
  13.     {
  14.         s*=1+x;
  15.         s-=b;
  16.     }
  17.     return s;
  18. }
  19. void ms(db l,db r)
  20. {
  21.     while(l<r)
  22.     {
  23.         m=(l+r)/2;
  24.         if(f(m)==0||abs(l-r)<=eps){ans=m;return;}
  25.         else if(f(m)<0)l=m;
  26.         else r=m;
  27.     }
  28. }
  29. int main()
  30. {
  31.     cin>>a>>b>>n;
  32.     r=5.0;
  33.     ms(l,r);
  34.     cout<<fixed<<setprecision(1)<<ans*100;
  35.     return 0;
  36. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-7-10 18:25:14 | 只看该作者
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int i,m,x,y;
  5. double ans;
  6. void ef(double l,double r)
  7. {
  8.     double k=(l+r)/2;
  9.     double u=r-l;
  10.     double a=m;
  11.     for(i=1;i<=y;i++)
  12.     a=a*(1.0+k)-x;
  13.     if(a==0 || u<0.0001)
  14.     {
  15.         k=k*100;
  16.         cout<<fixed<<setprecision(1)<<k;
  17.         return;
  18.     }
  19.     if(a>0) ef(l,k);
  20.     else ef(k,r);
  21. }
  22. int main()
  23. {
  24.     cin>>m>>x>>y;
  25.     ef(0,100);///这道题数据特坑爹,有一个利率200%多,现实中怎么可能。。。。为了保险从0和10000%开始二分
  26. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
沙发
发表于 2018-4-19 10:36:40 | 只看该作者
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double sum,s,n;///sum总金额 s每月金额 n月数
double eps=0.0001;
double l=0,m,r=100;///百分数
bool b=true;
long double answer(long double x)
{
    long double ss=sum,xx=x;
    for (int i=1; i<=n; i++)
    {
        ss=ss*(1+x);
        ss-=s;
        ///cout<<sum<<' ';
    }
    return ss;
}
int main()
{
    cin>>sum>>s>>n;
    long double ss=s*n;
    while (l<r && b)
    {
        m=(l+r)/2;
        if (abs(l-r)<eps) b=false;
        else if (answer(m)<0) l=m+eps;
        else if (answer(m)>0) r=m-eps;
        else if (abs(answer(m)-sum)<eps) b=false;
    }
    cout<<fixed<<setprecision(1)<<m*100;
    return 0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 12:36 , Processed in 0.114885 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表