题目概述
1.此题目的在于求出IRR,题中会向程序输入CFi的值并且通过NRV等于0的式子来求解出来
解题思路
1.我们要求出IRR的值,所以我们必须要知道IRR的范围,题中本意是 "IRR可以是负数, 但是必须要大于-1", 所以我们首先可推断出来IRR的范围是大于-1的,且取不到-1
2.为了方便求解,我们可以先把 irr 看成 "IRR+1" 所以我们irr的范围就变成了大于0
3.我们求导后,发现NRV是单调递减的:
当irr -> 0 时, NRV -> 正无穷 > 0, 当irr -> 正无穷时, NRV -> CF0 < 0(题目中要求了CF0必须是小于0的数)
所以NRV在(0,+∞) 中有且只有一个零点,根据题意不存在输出 "No"和"Too many" 的情况。
下面就是代码(二分法求解)
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int n;
double IRR, NRV, left, right, CF[15]; // 试试运气 打算采用二分法 定于二分法边界
while ((cin >> n) && n)
{
for (int i = 0; i <= n; i++)
{
cin >> CF[i]; // 收集各个项目期限的现金
}
IRR = 1.5;
left = 0, right = 1e6;
while (1) // 二分法
{
NRV = CF[0];
for (int i = 1; i <= n; i++)
{
NRV += CF[i] / pow(IRR, i);
}
if (fabs(NRV) <= 1e-5) break;
if (NRV < 0)
{
right = IRR;
IRR = (left + right) / 2;
}
else
{
left = IRR;
IRR = (left + right) / 2;
}
}
cout << fixed << setprecision(2) << IRR - 1 << endl;
}
system("pause");
return 0;
}