解题思路:

注意事项:

参考代码:

#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分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论