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二级辅导-统计字符 (C语言代码)浏览:1062 |
字符逆序 (C语言代码)浏览:862 |
【绝对值排序】 (C语言代码)浏览:499 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:644 |
C二级辅导-等差数列 (C语言代码)浏览:1315 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1019 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:610 |
字符串问题 (C语言代码)浏览:1636 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:539 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:600 |