题目中规定
但是测试中又出现了(-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语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:443 |
人见人爱A+B (C语言代码)浏览:663 |
【出圈】 (C语言代码)浏览:824 |
母牛的故事 (C语言代码)浏览:992 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:593 |
sizeof的大作用 (C语言代码)浏览:1591 |
1128题解(返回值为数组的情况)浏览:571 |
C二级辅导-计负均正 (C语言代码)浏览:523 |
一元一次方程 (C语言代码)浏览:4245 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:725 |