bacmive


私信TA

用户名:bacmive

访问量:19735

签 名:

努力、奋斗

等  级
排  名 299
经  验 5601
参赛次数 0
文章发表 36
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:二分法(牛顿迭代法)求解方程根

注意事项:该题中函数npv(IRR)在IRR∈(-1,+∞)上是递减的,故最多有一个根;


参考代码:

#include <stdio.h>
#include <math.h>

double calc(int T,int cf[])
{
   //int j;for(j=0;j<=T;j++) printf("%d ",cf[j]);
   //printf("I'm here\n");
   int i;
   double l_limit=-1+0.00001,r_limit=1e5;
   double irr=(l_limit+r_limit)/2;
   double npv=0;
   for(i=1;i<=T;i++) npv=npv+cf[i]/pow((1+irr),i);
   npv=npv+cf[0];
   /*
   printf("npv==%lf\n",npv);

   printf("%lf--%lf--%lf\n",l_limit,irr,r_limit);
   printf("%lf\n",fabs(npv));
   printf("%d\n",fabs(npv)>0.0001);
   printf("%d\n",npv>0);
   */
   while(fabs(npv)>0.0001)
   {
       //printf("%lf--%lf--%lf\n",l_limit,irr,r_limit);
       //printf("i'm in dead loop??\n");
       if(npv>0)  l_limit=irr;
       if(npv<0)  r_limit=irr;

       irr=(r_limit+l_limit)/2;
       npv=0;
       for(i=1;i<=T;i++) npv=npv+(1.0*cf[i])/pow((1+irr),i);
       npv=npv+cf[0];
       if(r_limit==l_limit) break;
   }
   if(fabs(npv-0)>0.0001) return -1;
   else return irr;

}


int main()
{
    int i=0,j,T,cf[11];
    double result[25];
    while(i<25&&scanf("%d",&T)&&T!=0)
    {
        for(j=0;j<=T;j++) scanf("%d",&cf[j]);
        result[i++]=calc(T,cf);
    }


    for(j=0;j<i;j++)
    {
        if(result[j]!=-1) printf("%.2lf\n",result[j]);
        else printf("No");
    }

    return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »