解题思路:
注意事项:
参考代码:
#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语言代码)浏览:576 |
C语言考试练习题_保留字母 (C语言代码)浏览:561 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:591 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:505 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:603 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:935 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:685 |
字符逆序 (C语言代码)浏览:455 |
1071题解浏览:484 |
1231题解(注意理解“输入多个测试实例”)浏览:785 |