解题思路:二分法(牛顿迭代法)求解方程根
注意事项:该题中函数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语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:443 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:564 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:633 |
【亲和数】 (C语言代码)浏览:541 |
三角形 (C++代码)递推浏览:825 |
复数求和 (C语言代码)浏览:994 |
1052题解(链表操作)浏览:782 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:1060 |
剔除相关数 (C语言代码)浏览:1156 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:564 |