编写一个java程序jse.java,按下面的公式计算自然对数底e的值(n的值取20):
e=1+ 1/1!+1/2!+1/3!+1/4!+…1/n!
直接看代码吧。2个方法,第一个很好理解,第二个我没看懂,又是算法的能量展示。
/**
* 自然对数的底e的计算。
* 1+1/1! + 1/2! + 1/3! + ...
*
* @author 老紫竹研究室(laozizhu.com)
*/
publicclassTest {
publicstaticvoidmain(String args[])throwsException {
// 方法1
doublee =1.0;
doublet =1.0;
for(inti =1; i <=20; i++) {
t /= i;
e += t;
}
System.out.println(e);
// 方法2,可惜我没看懂,很精妙
e =0.0;
for(inti =20; i >0; i--) {
e = (e +1.0) / i;
}
e++;
System.out.println(e);
}
}
运行结果
2.7182818284590455
2.718281828459045
感谢网友提供的第二种方法的解释,我们来看看
写成连分式(下面写前几项)
1
---- + 1
20
------------ + 1
19
-------------------- + 1
18
-------------------------------- + 1
17
打开后正是
1/1! + 1/2! + 1/3!+...+1/20!
一开始是
1/20
然后是
(1/20+1)/19 = 1/20/19 + 1/19
然乎是
(1/20/19 + 1/19)/18 = 1/20/19/18 + 1/19/18 + 1/18
。。。
最后就变成了
1/20/19/18/。。。/1 + 1/19/18/17/.... + 。。。
==》
1/20! + 1/19! + 1/18! .....
果然精妙。
当然,乘法和除法次数和我的第一个算法一样,所以效率上并没有优势。