import java.io.*; public class Main { static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))); public static void main(String[] args) throws IOException { while(true) { // 存入数据 int T=Integer.parseInt(bf.readLine()); if(T==0) break; String[] s=bf.readLine().split(" "); double[] CF=new double[T+1]; for(int i=0;i<=T;i++) { CF[i]=Integer.parseInt(s[i]); } double L=-1; double R=9999; for(int i=0;i<100;i++) { double IRR=(L+R)/2; double sum=0; double now=1; for(int j=0;j<=T;j++) { sum+=CF[j]/now; now*=(1+IRR); } if(sum>0) { L=IRR; }else{ R=IRR; } if(L==R) break; } pw.printf("%.2f\n",R); } pw.flush(); } }
解题思路:
看到这类求方程的题目,应先想到二分,观察一下NPV函数,发现IRR增加,NPV递减,严谨一些,对函数进行求导,发现这个函数单调递减。二分法,最关键的是找到上下限,根据题目意思,这道题的范围为(-1,无穷),(额。。。其实这道题说的有点问题吧阿sir!!!)。
然后找到之后呢,得到中间值,如果取得的值大于0,那就是IRR小了,因为IRR越大函数越小嘛,那就把左边的范围减小,L设为当前值,反之亦然,为什么循环100次,为什么L和R相等就退出呢,看注意事项中。
找到了输出一下就行了 ,注意两位小数哦
注意事项:
1、快读快写获得值,不要小看快读快写,能快将近两倍
2、为什么循环100次,L等于R退出,因为double的精确度太高!,题目只需要两位,所以给定一个循环次数的最大值,当上限和下限相等的时候就退出
0.0分
3 人评分
C语言程序设计教程(第三版)课后习题11.11 (C语言代码)浏览:768 |
简单的a+b (C语言代码)浏览:623 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:638 |
回文串 (C语言代码)浏览:2845 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:538 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:526 |
WU-C语言程序设计教程(第三版)课后习题12.1 (C++代码)浏览:919 |
1113题解浏览:784 |
回文数字 (C语言代码)浏览:2509 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:629 |