#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 人评分
题有问题,大家可以把给的示例第二组带入方程算一下,一个根确实是0.5但还有一个根是-7/4小于-1,是满足条件的。但给出的的示例答案错了。应该是too many
想问下double x=-1.0+1e-5,y=1e6,以及if(fabs(npv) < 1e-6),这两个地方是人为设定的么?也就是可以改成别的自定义的差不多范围?
兄弟,读题读的我心里发慌。 题目中IRR的范围是(-∞,-1]U[0,+∞)
IP判断 (C语言代码)浏览:747 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:652 |
Hello, world! (C++代码)浏览:1717 |
C语言考试练习题_保留字母 (C语言代码)浏览:667 |
DNA (C语言描述,蓝桥杯)浏览:1515 |
1908题解浏览:619 |
愚蠢的摄影师 (C++代码)浏览:847 |
简单的a+b (C语言代码)浏览:517 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:666 |
C语言程序设计教程(第三版)课后习题7.4 (C++代码)浏览:530 |