#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,+∞)
矩阵乘法 (C++代码)浏览:1645 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:631 |
【出圈】 (C语言代码)浏览:582 |
不会做的浏览:944 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:498 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:625 |
wu-理财计划 (C++代码)浏览:890 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:697 |
母牛的故事 (C语言代码)浏览:1444 |