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

注意事项:该题中函数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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论