原题链接:内部收益率
解题思路:二分法(牛顿迭代法)求解方程根
注意事项:该题中函数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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复