荒天帝


私信TA

用户名:ljhabc

访问量:4038

签 名:

等  级
排  名 433
经  验 4895
参赛次数 1
文章发表 126
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

注意事项:

参考代码:

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

  评论区

  • «
  • »