湖南省第六集程序设计竞赛 E-内部收益率(二分法)


Description

在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1CF2, ...,CFTIRR是下面方程的解:

为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,...,TCFi>0)。根据定义,IRR可以是负数,但不能大于-1。

Input

输入文件最多包含25组测试数据,每个数据占两行,第一行包含一个正整数T(1<=T<=10),表示项目的期数。第二行包含T+1个整数:CF0, CF1, CF2, ..., CFT,其中CF0 < 0, 0 < CFi < 10000 (i=1,2,...,T)。T=0表示输入结束,你的程序不应当处理这一行。

Output

对于每组数据,输出仅一行,即项目的IRR,四舍五入保留小数点后两位。如果IRR不存在,输出"No",如果有多个不同IRR满足条件,输出"Too many"(均不含引号)

Sample Input

1-1 22-8 6 90

Sample Output

1.000.50
分析:

好费劲,一个普通的二分法,让我做到了现在,还是多练练吧,注意二分法的边界值的转换,判定的条件!


#include<stdio.h>

int main()
{
   int t,i,j,f,p[12];
    while(scanf("%d",&t)&&t!=0)
    {
        scanf("%d",&f);
        double mid,m=1000,n=-1,r,k,sum;
        for(i=0;i<t;i++)
        scanf("%d",&p[i]);
        while(m-n>1.0e-6)    //一直处理到两数的差值小于10的-6次方
        {
              mid=(m+n)/2; //采用二分法
            k=1;
            sum=0;
            for(j=0;j<t;j++)
            {
                k*=(1.0/(1+mid)); //1/(1+IRR)
            sum+=p[j]*k;  //cf/(1+IRR)
            }
            if(sum+f>0)
                n=mid;
            else
                m=mid;
        }

        printf("%.2lf\n",mid);
    }
return 0;
}


你可能感兴趣的:(湖南省第六集程序设计竞赛 E-内部收益率(二分法))