回 帖 发 新 帖 刷新版面

主题:一个很牛的计算pi的c程序

#include <stdlib.h>  
#include <stdio.h>  

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);  
}  

计算结果:  
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185  

回复列表 (共115个回复)

51 楼

虽然作者有点故弄玄虚,但确实不能不承认他很牛

注意到for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b)中,有d/g--和d*=b两句,其实g=2*b-1,可以确定用的公式是pi/2=1+1/3+1/3*2/5+……   

大家可以只运行一下for(b=2800;d+=f[b]*a,f[b]=d%(2*b-1),d/=(2*b-1),--b;d*=b)即相当于第一次循环,再看看d的值,就能理解那个公式的运用了。

每一次外层循环都得到一个d值,除以a后再将其输出。a的作用相当与将其截断,然后先将其前四位输出,后面的内容先存着以后再用。
作者的厉害之处在与利用某种精妙的原理,可以充分的存储信息,然后一步一步将精度踢高。这就是外层循环的作用,现在还没想出其机理。

先说到这,继续think ……

52 楼

上面解释这么清楚,也很N哦~呵呵。。

53 楼

shuai ge,的确编的不错,能不能修改一下呀!
在3的后面再加的小数点".",就更加完美了,希望楼主答复呀!!
期待佳音~~~~~~~~

54 楼

好啊

55 楼

能编译通过吗?得have a try!

56 楼

算法不明白

57 楼

不可思意

58 楼

全局变量和静态局部变量的数据是存在data区的,未初始化就为0,只有函数内部的局部变量(auto)存于stack区,不初始化为一不确定数值。

59 楼

变量不赋值…………



PS:可以肯定的是前30位肯定正确,我背过。

60 楼

非常艺术的 程序!!

只能用艺术来形容了。。。。。。。。。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册