解题思路:
根据公式初步构造相关变量,其次用程序编写出公式表达式,再根据题意进行适当补充。
注意事项:
注意NPV的取值范围,应该是大于-1,然后可以分析得知该公式单调递减,因此无需考虑Too many的情况
参考代码:
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
int T; //期数
while (cin >> T && T) {
vector<int> CF(T + 1);//保存各期现金流
double left, right; //现金流总和(用于判断是否有零点),二分法的边界
double IRR, NPV; //内部收益率(+1后的正值)、投资净现值
for (int i = 0; i < T + 1; i++) {
cin >> CF[i];
}
// 初始化,默认给这个范围
left = -1.0 + 1e-5;
right = 1e+6;
while (right - left > 1e-6) { //设置精度阈值
IRR = (right + left) / 2; //初始化并更新IRR
NPV = 0; //函数内定义的变量须设置初值
for (int i = 0; i < T + 1; i++) {
NPV += 1.0 * CF[i] / pow(1 + IRR, i); // 计算 NPV
}
if (fabs(NPV) <= 1e-6) {
break; // 接近0即认为找到了零点,否则计算量很大
}
// 二分法
if (NPV < 0) {
right = IRR;
}
else {
left = IRR;
}
}
if (IRR <= -1) {
cout << "No" << endl;
break;
}
cout << fixed << setprecision(2) << IRR << endl; // 输出IRR,格式化为两位小数
}
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复