#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(void) { int a[100],i,j,k,n,x; while(scanf("%d",&n) && n) { for(i=0;i<=n;i++) scanf("%d",a+i); double x=-1.0+1e-5,y=1e6,irr,npv; for(j=0;j<100;j++) { irr=(x+y)/2; npv=0; for(k=0;k<=n;k++) npv+=1.0*a[k]/pow(1+irr,k); if(fabs(npv) < 1e-6) break; if(npv < 0) y=irr; if(npv > 0) x=irr; } printf("%.2lf\n",irr); } return 0; }
解题思路:irr的取值范围是(-1,+无穷大)
npv的表达式在此范围上递减函数
当 irr -> -1 时候,表达式为正值,
当 IRR —> 无穷大时候, 表达式为负值
因此必有一个解在该区间上。
使用二分法进行暴力计算
找到近似的irr
0.0分
6 人评分
想问下double x=-1.0+1e-5,y=1e6,以及if(fabs(npv) < 1e-6),这两个地方是人为设定的么?也就是可以改成别的自定义的差不多范围?
兄弟,读题读的我心里发慌。 题目中IRR的范围是(-∞,-1]U[0,+∞)
C语言程序设计教程(第三版)课后习题9.4 (Java代码)浏览:1288 |
哥德巴赫曾猜测 (C语言代码)浏览:854 |
剪刀石头布 (C语言代码)不知道怎么直接在scanf中用枚举变量浏览:1114 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:566 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:1379 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:1025 |
printf基础练习2 (C语言代码)浏览:598 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:656 |
水仙花 (C语言代码)浏览:951 |
Hello, world! (C语言代码)浏览:671 |