海洋之心


私信TA

用户名:wanggongsheng

访问量:122673

签 名:

等  级
排  名 17
经  验 20526
参赛次数 3
文章发表 163
年  龄 26
在职情况 学生
学  校
专  业 计算机技术

  自我简介:

读研ing,平时不登录dotcpp

#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分

6 人评分

  评论区

题有问题,大家可以把给的示例第二组带入方程算一下,一个根确实是0.5但还有一个根是-7/4小于-1,是满足条件的。但给出的的示例答案错了。应该是too many
2022-11-29 08:58:44
好难啊这个东西 二分法属实没想到
2021-10-02 20:51:37
想问下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
  • »