原题链接:内部收益率
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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复