湖南省第六集プログラム設計コンテストE-内部収益率(二分法)

1677 ワード

Description
金融では、内部収益率IRRを使用してプロジェクトの投資財務効果を評価することがあります.これは、投資純現在価値NPVを0に等しくする割引率に等しいです.言い換えれば、所与の項目の期間数T、初期キャッシュフローCF 0および項目の各期間のキャッシュフローCF 1,CF 2,…,CFT,IRRは次の式の解である.
簡単にするために、本題は、プロジェクトの開始時に投入された(すなわち、初期キャッシュフローCF 0<0)を除いて、残りの各期間がお金を稼ぐことができる(すなわち、すべてのi=1,2,...,T,Cpi>0)と仮定する.定義によれば、IRRは負数であってもよいが、−1より大きくてはならない.
Input
入力ファイルは最大25組のテストデータを含み、各データは2行を占め、第1行は正の整数T(1<=T<=10)を含み、プロジェクトの期間数を表す.2行目はT+1個の整数を含む:CF 0,CF 1,CF 2,...,CF 0<0,0Output
各データセットについて、出力は1行のみ、すなわち項目のIRRであり、小数点以下の2桁を四捨五入する.IRRが存在しない場合は「No」を出力し、複数の異なるIRRが条件を満たす場合は「Too many」を出力する(いずれも引用符を含まない)
Sample Input
1-1 22-8 6 90

Sample Output
1.000.50

分析:
とても苦労して、1つの普通の二分法、私に今までやり遂げさせて、やはり多く練習しましょう、二分法の境界値の転換に注意して、判定の条件!
#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
",mid); } return 0; }