原题链接:内部收益率
解题思路:二分法(牛顿迭代法)求解方程根
注意事项:该题中函数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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复