前几天同学让我帮他看个程序,程序如下:
int a = 10000,b,c=2800,d,e,f[2801],g;
int main()
{
for(;b-c;) f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
return 0;
}
当时很惊讶这样就能计算圆周率?查了一下,感觉这几行代码水实在太深了,佩服。
这个小程序是大神Dik T. Winter at CWI 的作品
这个算法主要利用 普遍的傅立叶级数展开方法 来计算圆周率
公式: pi = 2 + 1/3 * (2 + 2/5 * (2 + 3/7 * (2 + ... (2 + k/2k+1 * (2 + ... ))...)))
好像也有另一种方法:
arccosx =π/2-arcsinx =π/2-∫[0,x]d(arcsinx) =π/2-∫[0,x]dx/√(1-x^2) =π/2-∫[0,x]∑[(2k)!/(2^k*k!)^2]x^(2k) =π/2-∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....), 如果让x=1,可以得到arccos1 = 0 =
=π/2-∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....), 所以
π/2 = ∑[(2k)!/((2k+1)(2^k*k!))]x^(2k+1)(k=0,1,2,3,4.....),再用 到欧拉加速收敛变换 得到变成用的公式
之后再将这个公式变为程序,说起来简单,事实很难理解
具体如下,转载自 http://www.cnblogs.com/PegasusWang/archive/2013/03/17/2965189.htm l点击打开链接
以下为转载:
long a=10000, b, c=2800, d, e, f[2801], g;main(){ for(;b-c;) f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c; d+=f[b]*a, f[b]=d%--g, d/=g--, --b; d*=b); scanf("%s");}简短的4行代码,就可以精确计算机出800位的PI(圆周率)值。实在太震撼人心了。这样的程序也能运行,竟然还能能完成这样让人难以置信的任务,真是太神了。一、源程序本文分析下面这个很流行的计算PI的小程序。下面这个程序初看起来似乎摸不到头脑,不过不用担心,当你读完本文的时候就能够基本读懂它了。程序一:很牛的计算Pi的程序#include <stdio.h>int a=10000,b,c=2800,d,e,f[2801],g; main(){for(;b-c;) f[b++]=a/5;for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a) for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);}二、数学公式数学家们研究了数不清的方法来计算PI,这个程序所用的公式如下:pi = 2 + 1/3 * (2 + 2/5 * (2 + 3/7 * (2 + ... (2 + k/2k+1 * (2 + ... ))...)))至于这个公式为什么能够计算出PI,已经超出了本文的能力范围。下面要做的事情就是要分析清楚程序是如