C语言计算内部回报率(或名内部收益率)(IRR)

这是ECNU OJ 上的一个题目,是某次的课后作业,我把它搬运上来与大家分享一下。

在 Excel 中有一个函数 IRR 用于计算一个投资项目的内部回报率(Internal return rate)。
在项目产生利润之前需要先投入建设资金(假设称为 c0),建成后每年产生的利润(假设称为 c1,c2…)。内部回报率(记为 r,范围为 −100%∽+100%)是到项目末期的现金流为 0 的贴现率。

例如:某项目建设资金为 10000,项目生产持续期为 3 年,每年利润为 3000,4000,5000,那么 r 满足:

−10000(1+r)^3+3000(1+r)^2+4000(1+r)+5000=0
Excel 计算结果 r 大约为 8.8963%。

本题的测试数据保证 r 只有唯一解。

Input
第 1 行:整数 T (1≤T≤10) 为问题数。
第 2∽3 行:第一个问题的数据。一行整数 n (1≤n≤100) 表示项目生产年数。后面 1 行包含 n+1 个由一个空格分隔的整数,表示投入的建设资金 c0 和 n 年中每年的利润 ci。c0>0,0≤ci≤1000000000。
第 4∽2T+1 行:后面问题的数据,格式与第一个问题相同。

Output
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在每一行中输出计算出的 r(保留小数后 4 位)。

#include 
#include 
int main()
{
    int n,i,m,j,j2;
    double A,B,r,X,Y,C,x1;
    long long huge=1000000000;
    int a[102];
    scanf("%d",&n);//n turn to T
    for(i=1;i<=n;i++)
    {
        A=-1.0;B=1.0;//设定r的范围
        scanf("%d",&m);
        m=m+1;
        printf("case #%d:\n",i-1);

            for(j=1;j<=m;j++)
            {
                scanf("%d",&a[j]);
            }
            while((B-A)*huge>1.0)
            {
                r=(A+B)/2.0;
                x1=A+1;
                X=-1*a[1];
                for(j2=2;j2<=m;j2++)
                {
                    X*=x1;
                    X+=a[j2];
                }
                x1=B+1;
                Y=-1*a[1];
                for(j2=2;j2<=m;j2++)
                {
                    Y*=x1;
                    Y+=a[j2];
                }
                x1=r+1;
                C=-1*a[1];
                for(j2=2;j2<=m;j2++)
                {
                    C*=x1;
                    C+=a[j2];
                }
                if(X*C>0) A=r;
                else B=r;
            }
        if((r-0)*huge<1&&(r-0)*huge>-1)
        printf("0.0000%%\n");
        else
        printf("%.4lf%%\n",r*100);
        }
    return 0;
}

你可能感兴趣的:(C语言计算内部回报率(或名内部收益率)(IRR))