有史以来最经典的 C 程序, 4行语句计算 800 位的 PI 值,大家可以读一下

tanes 2003-10-19 11:18:33
大家可以读一下 ,有兴趣的话,可以把它翻译一下, 我看过一个翻译,好像有整整一页



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);}
...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanes 2003-10-22
  • 打赏
  • 举报
回复
我今天一个不小心,找到原文了




记得谭浩强的书中就有求pi的公式…………
4/1pi=1+1/3-1/5+1/7-1/9………………(不知道有没错哦,很久不看了)

这样的公式求pi,你能算到几位,而且时间花得很多,代码也很长……(数位都不够)

在Obfuscated C Contest佳作选录中有一代码…………(被后人称为外星人程序,因为作者没有留下姓名)

只用4行代码(包括声明变量,函数),可轻松算到pi的800位…………

实在令人叹服,我想,不关是我,就连看这篇文章的各位,一辈子都不可能写出这样的文章…………(不是我吹牛……)

浅浅分析一下,这篇文章的数学技巧不高,但是编程技巧实在是………………

下面列出此外星人程序…………………………………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………

………………


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

有人分析过,展开得到的程序是…………
long b,c=2800,d,e,f[2801],g;
int main(int argc,char* argv[])
{
/*for(;b-c;)f[b++]=10000/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/10000),e=d%10000)
for(b=c;d+=f[b]*10000,f[b]=d%--g,d/=g--,--b;d*=b);*/
for(b=0;b<c;b++)
f[b] = 2;
e=0;
while(c > 0)
{
d=0;
for(b=c;b>0;b--)
{
d*=b;
d+=f[b]*10;
f[b]=d%(b*2-1);
d/=(b*2-1);
}
c-=1;
printf("%d",(e+d/10)%10);
e=d%10;
}
return 0;
}
这pi代码的计算数学公式是……
f(1)=1
f(n+1)=f(n)*n/(2*n+1)
PI/2=f(1)+f(2)+f(3)+.....+f(n) n->无穷大。
或:
PI/2 = 1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + (1*2*3*4)/(3*5*7*9)+...

……………………………………………………………………
有兴趣的朋友可以自己试试,不过可以告诉大家,在不同的编译条件下得到的结果可能不同,i++与++i的诧异………………

下面有个结果的例子:
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185

tass 2003-10-21
  • 打赏
  • 举报
回复
up
tudou614 2003-10-21
  • 打赏
  • 举报
回复
我好象原来在南大小百合BBS里面第一次见到,

不过现在怎么都找不到了!!!!!!!!
tudou614 2003-10-21
  • 打赏
  • 举报
回复
又是那个巨牛求PI

写这个程序的作者是谁呀??


我也是一直看不懂!!!!!!!!!!!!!!!!!!
tanes 2003-10-20
  • 打赏
  • 举报
回复
但是看到的时候只是把这个代码考下来了,但是没有考翻译,现在找不到了,我记得是在一个什么论坛里,我现在去了也找不到了
seefront1 2003-10-19
  • 打赏
  • 举报
回复
哪里有翻译啊??我想看看~
seefront1 2003-10-19
  • 打赏
  • 举报
回复
神奇~~~
kicool 2003-10-19
  • 打赏
  • 举报
回复
我可以一行就搞定咯俄
fifo333 2003-10-19
  • 打赏
  • 举报
回复
用的是什么算法呀,原理是什么?
那篇文章哪里可以找到?
leyt 2003-10-19
  • 打赏
  • 举报
回复
main(){for(;b-c;)f[b++]=a/5;

这只算一行?

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧