|
一个号称外星人发明的求pi程序及由此引发的争鸣 -------------------------------------------------------------------------------- 认为是C高手的都进来[讨论] 认为是C高手的都进来[讨论]
记得谭浩强的书中就有求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的诧异………………
下面有个结果的例子:
31415926535897932384626433832795028841971693993751058209749445923078164062862089
98628034825342117067982148086513282306647093844609550582231725359408128481117450
28410270193852110555964462294895493038196442881097566593344612847564823378678316
52712019091456485669234603486104543266482133936072602491412737245870066063155881
74881520920962829254091715364367892590360011330530548820466521384146951941511609
43305727036575959195309218611738193261179310511854807446237996274956735188575272
48912279381830119491298336733624406566430860213949463952247371907021798609437027
70539217176293176752384674818467669405132000568127145263560827785771342757789609
17363717872146844090122495343014654958537105079227968925892354201995611212902196
08640344181598136297747713099605187072113499999983729780499510597317328160963185
作者:metababy 发表时间:2003-01-22 12:28 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290342
看不清楚的朋友
看不清楚的朋友:
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);}
这就是那段pi的外星人程序………………
作者:metababy 回复日期:2003-01-22 12:29 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290343
我开始看了,还有点..
我开始看了,还有点怀疑,不过,经过分析语法,刚才,我也上机试一下,的确是天才C,,,,,,,,
我对此作者,佩服得五体投地,,,,,太厉害了,,,
版主,你可以给细细的分析一下,写出来,让大家过过瘾吗????
这么好的程序代码,真是感谢谢您放到这儿,让我们看,好东西,我们要细细的品味, 真是越看
,越觉得像陈年老酒一样,越发的香越发的淳.....
朋友们,细细的品吧,发出心里的感慨....
真是太好了,,,极品代码,,,真的是有程序的美感,,我现在才体会到,,,,
作者:metababy 回复日期:2003-01-22 12:30 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290344
能好好说说吗?
作者:天极网友 回复日期:2003-01-22 15:50 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290345
强烈要求多发此类文章
作者:天极网友 回复日期:2003-02-07 10:20 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290346
看不懂呀,在谭书中的哪呀?
作者:天极网友 回复日期:2003-01-22 15:53 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290347
他写的《c程序设计》中....
作者:metababy 回复日期:2003-01-22 18:52 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290348
这不过是故意买弄而已!!!!!!!!!但是其对c的熟练程度是很高的。
作者:天极网友 回复日期:2003-01-25 21:16 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290349
的确很精彩,但是仔细看了一下,我觉得此代码除了占用磁盘空间比较少之外,再没有什么其它优点了
说实话,这四行代码在一些老资历的编程者看来,简直就是一碗“意大利面条”,怎么讲?“乱!”想一想,用高级语言写源代码的目的是什么?还不是为了给人看!“源代码就是给人看的,如果不想给人看懂,不如用汇编!”所以,一堆能完成任务而没几个人能看懂的代码算不上是精彩的代码,因为这样的代码维护起来极其麻烦,我敢打赌,连作者都不愿意看它一眼。再想一想,如果在一个大工程中编写的程序全都是这样的代码,万一其中有一个BUG,你调试起来多费劲啊!
这是一个误区,大家不要为缩短自己的源代码而乐此不彼,这是不值得的!!!
作者:好色的狐狸 回复日期:2003-01-26 00:26 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290350
支持支持,顶!!!
作者:kkhu 回复日期:2003-02-11 09:46 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290351
上楼,兄弟说的很好~~~!支持。
作者:shupao 回复日期:2003-01-26 13:40 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290352
真的能实现吗?
谢谢你,我会回去试的,希望你多发这样的文章
作者:天极网友 回复日期:2003-01-27 16:44 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290353
看了大家的发言,觉得...
嗯,,,的确...这代码一般不是能轻易看明白的,,现在看来,唯一的优点,就是能够以较快的速度得到答案!不过,有位兄弟说得对---不如用汇编!而且在现在看来,速度也不在像以前那样重要了...
从另一个角度想来,我也还是很钦佩此程序作者的天才,要是用汇编的话,恐怕更没多少人能理解了,更别说,用汇编来写更麻烦,冗长的代码,更会弄大头.....
好多东西,都是有两面的,,各取所好罢了,我是很喜欢这的,不过,我是不会这样写程序的,第一.我自知,写不出如此有水平的代码.第二,我没时间为了现在来说不太重要的速度,而要想一整天,来编更有效率代码....
个人看法.
作者:metababy 回复日期:2003-01-28 13:33 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290354
但是不要忽视了程序的可读性哦?......
作者:天极网友 回复日期:2003-01-31 14:41 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290355
历害。如果不运行,我绝对不知道它要做什么!
作者:火竹 回复日期:2003-02-01 19:33 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290356
厉害呀!!!
作者:天极网友 回复日期:2003-02-08 16:55 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290357
结果很奇怪
我用的编译器是bc31,四行代码的程序执行结果不可思议,被展开的程序运行结果正确,不知道为什么
作者:天极网友 回复日期:2003-02-09 11:13 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290358
好,好!有意思!
作者:天极网友 回复日期:2003-02-09 11:33 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290359
你用bc31,那是按c++编译的,这代码是要用c编译的。。。
作者:metababy 回复日期:2003-02-10 12:36 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290360
我用的是c++编译的
呵呵,见笑见笑
作者:天极网友 回复日期:2003-02-11 09:01 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290361
有很多人说这种代码有这样那样的缺点,不过,我是喜欢黑客编程的,从这个角度来讲,这种代码是最好的,因为效率和速度永远是我们最需求的,...
对效率的追求是永不满足的。。。。
作者:metababy 回复日期:2003-02-13 12:20 本贴地址:http://club.yesky.com/bbs/jsp/view.jsp?articleID=290362
|