这是一段不知出处的源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include<iostream>
using
namespace
std;
int
main() {
int
N = 3;
int
a[ 1000 ] = { 0 };
//定义一个数组
int
s = 1;
for
(
int
n = N; n >= 1; n-- )
{
int
r = s%n;
s = s / n + 1;
int
i = 0;
for
( ; i<N; i++ )
{
r = r * 10 + a[ i ];
a[ i ] = r / n;
r %= n;
}
for
( i = N - 1; i>0; i-- )
{
a[ i - 1 ] += a[ i ] / 10;
a[ i ] %= 10;
}
s += a[ 0 ] / 10;
a[ 0 ] %= 10;
}
cout << s <<
"."
;
for
(
int
i = 0; i < N; i++ )
{
cout << a[ i ];
}
cout << endl;
system
(
"pause"
);
return
0;
}
|
这个算法是用来计算自然对数e的近似值,结果存在一个内存数组里。数学思想是基于欧拉1748年把牛顿的二项式定理改进的一个公式(3)
这个公式使得欧拉把e精确到23位小数点。受欧拉公式的启发,衍生出来很多变种。其中的一个变种是
本算法就是对(4)公式的翻译。第一个外循环是累乘计算(4)式的每一个括号项。当k足够大的时候,式子的...≈0,所以可以初始化为s=1.第一个内循环是计算(1+r)/k,把每一位小数存入相应的数组位置里。由于每一次内循环都会往各个小数位上加上一定的商,所以会超过10,于是要把他放到前一位里面,这便是第二位做的事情。
还有很多计算e的高效算法,请参见参考资料。
参考资料: