#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

点赞(7)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

修索 2年前 回复TA
题有问题,大家可以把给的示例第二组带入方程算一下,一个根确实是0.5但还有一个根是-7/4小于-1,是满足条件的。但给出的的示例答案错了。应该是too many
猛男你好 3年前 回复TA
好难啊这个东西 二分法属实没想到
MyShrimp 4年前 回复TA
@云水 我百度了一下,自己printf了一下都是-2<-1....
MyShrimp 4年前 回复TA
@云水 我自己想的范围和你一样,但我发现所有答案都是-1到正无穷,好慌啊
星空 4年前 回复TA
想问下double x=-1.0+1e-5,y=1e6,以及if(fabs(npv) < 1e-6),这两个地方是人为设定的么?也就是可以改成别的自定义的差不多范围?
云水 4年前 回复TA
兄弟,读题读的我心里发慌。
题目中IRR的范围是(-∞,-1]U[0,+∞)