桐桑入梦


私信TA

用户名:wanggongsheng

访问量:90804

签 名:

2547668411@qq.com是我的邮箱,有问题可以用邮箱联系

等  级
排  名 7
经  验 16145
参赛次数 3
文章发表 163
年  龄 20
在职情况 学生
学  校
专  业

  自我简介:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(void)
{
   int a[100],i,j,k,n,x;
   while(scanf("%d",&n) && n)
   {
       for(i=0;i<=n;i++)  scanf("%d",a+i);
       double x=-1.0+1e-5,y=1e6,irr,npv;
       for(j=0;j<100;j++)
       {
           irr=(x+y)/2;
           npv=0;
           for(k=0;k<=n;k++) npv+=1.0*a[k]/pow(1+irr,k);
           if(fabs(npv) < 1e-6)  break;
           if(npv < 0) y=irr;
           if(npv > 0) x=irr;
       }
       printf("%.2lf\n",irr);
   }
    return 0;
}

解题思路:irr的取值范围是(-1,+无穷大) 

npv的表达式在此范围上递减函数

当 irr -> -1 时候,表达式为正值,

当 IRR —> 无穷大时候, 表达式为负值
因此必有一个解在该区间上。

使用二分法进行暴力计算

找到近似的irr

 

0.0分

3 人评分

  评论区

想问下double x=-1.0+1e-5,y=1e6,以及if(fabs(npv) < 1e-6),这两个地方是人为设定的么?也就是可以改成别的自定义的差不多范围?
2020-02-11 14:34:07 | |
兄弟,读题读的我心里发慌。
题目中IRR的范围是(-∞,-1]U[0,+∞)
2020-02-09 17:40:42 | |
  • «
  • 1
  • »