解题思路:
注意事项:
参考代码:
#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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复