原题链接:内部收益率
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复