原题链接:内部收益率
题目中规定
但是测试中又出现了(-1,0)范围内的结果
结合定义,可以推测出题目的本意是“IRR可以是负数,但必须大于-1”,故IRR的范围其实是(-1,+∞)
所以设x = 1 + IRR, x的范围是(0,+∞)
NPV(x) = CF0 + CF1/x + CF2/x^2 + ... + CFT/x^T
求导后,容易发现NPV是单调递减的,
并且x -> 0时,NPV -> +∞ > 0,
x -> +∞时,NPV -> CF0 < 0,
所以NPV(x)在(0,+∞)有且仅有一个零点。
二分法求出零点。
#include<iostream> #include<cmath> #include<iomanip> using namespace std; const int N = 15; double CF[N]; double x, y, rr, NPV; // rr = 1 + irr int main(){ int n; while( (cin>> n) && n ){ for( int i = 0; i <= n; i++) cin >> CF[i]; rr = 1.5; //经验地给定一个初值 x = 0, y = 1e6; while(1) //二分法 { NPV = CF[0]; for (int i = 1; i <= n; i ++) NPV += CF[i] / pow(rr,i); if(fabs(NPV) <= 1e-5) break; // if(NPV < 0) { y = rr; rr = (x + y) / 2; } else{ x = rr; rr = (x + y) / 2; } // } cout<< fixed << setprecision(2) << rr - 1 << endl; } return 0; }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复