解题思路:
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int T, CF, sum; // 期数,现金流,现金流之和(用于判断是否有零点)
double left, right; // 二分法的边界
double IRR, NPV; // 内部收益率(+1后的正值)和投资净现值
while (cin >> T && T) {
vector<int> term; // 保存各期现金流
for (int i = 0; i < T + 1; ++i) {
cin >> CF;
term.push_back(CF); //直接 cin >> term[i] 会出问题
sum += CF;
}
if (sum < 0) {
cout << "No" << endl;
break; // 没有零点
}
// 初始化,默认给这个范围
left = 0;
right = 1e6;
IRR = 1.5;
while (1) {
/* 两种写法,但是没有 NPV = 0 这句话就没法放进下面的 for 中,原因不明
NPV = 0;
for (int i = 0; i < T + 1; ++i) {
NPV += (term[i] / pow(IRR, i));
}
*/
NPV = term[0];
for (int i = 1; i < T + 1; ++i) {
NPV += (term[i] / pow(IRR, i));
}
if (fabs(NPV) <= 1e-5) {
break; // 接近0时默认为找到了零点,否则可能计算量巨大
}
// 二分法
if (NPV < 0) {
right = IRR;
} else {
left = IRR;
}
IRR = (left + right) / 2;
}
cout << fixed << setprecision(2) << IRR - 1 << endl;
}
return 0;
}
0.0分
0 人评分
C语言考试练习题_排列 (C语言代码)浏览:767 |
C语言程序设计教程(第三版)课后习题6.6 (C++代码)浏览:649 |
The 3n + 1 problem (C语言代码)浏览:603 |
简单的a+b (C语言代码)浏览:529 |
C二级辅导-计负均正 (C语言代码)浏览:523 |
整除问题 (C语言代码)浏览:594 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:1213 |
简单的a+b (C语言代码)浏览:597 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:2173 |
Manchester-字符逆序(稳,附带小问题)浏览:5076 |