分类: C/C++
2007-11-03 21:12:48
#include
#include
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);
return 0;
}
一个牛人对外星人程序的破解:
记得谭浩强的书中就有求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
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
……
转自:http://blogger.org.cn/blog/more.asp?name=njucs&id=3765