解题思路:

根据公式初步构造相关变量,其次用程序编写出公式表达式,再根据题意进行适当补充。
注意事项:

注意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;

}


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论