问题:
在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, …,CFT,IRR是下面方程的解:
为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,…,T,CFi > 0)。根据定义,IRR可以是负数,但不能大于-1。
分析:
可以用二分法不断二分最后不断逼近正确答案,因为CF0是负的,所以把后面几项的和与第一项比较就行,因为边界不好控制,所以直接二分50次;
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int N = 10000 + 5; const int eps = 1e-8; double a[N]; double solve(int n){ double l,r,mid,f,ans; l = -1.0,r = 10000; for(int t = 1;t<=100;t++){ mid = (r+l)/2; f = 1.0,ans = 0; for(int i=1;i<=n;i++){ f=f/(1+mid); ans += a[i]*f; } if(ans > (-a[0])) l = mid; else r = mid; } return mid; } int main(){ int n; while(cin >> n && n){ for(int i=0;i<=n;i++) cin >> a[i]; printf("%.2lf ",solve(n)); } return 0; }