« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1405566 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]一个让人发狂的PI求解C程序 |
一个让人发狂的PI求解C程序
作者: 张桂权
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(圆周率)值。实在太震撼人心了。这样的程序也能运行,竟然还能能完成这样让人难以置信的任务,真是太神了。真让人百思不知其解了。不知道它是采用了哪一个级数公式,收敛速度如此之快?在《程序员》第十一期中还专门提供了这个程序源码。喜欢挑战的朋友请来试一试哦?
这是某一年The International Obfuscated C Code Contest(国际模糊C代码大赛)上的获奖作品(努力了,但是没有找到一个确切的时间)。这是属于C大师的盛会,因为这是一件极具挑战的活儿。
这是Linux/Unix/... 下的版本,需要更改才能在Windows平台上运行。
The International Obfuscated C Code Contest 的目标是:
在以下几条规则的前提下,编写晦涩难懂的(模糊的、混乱的)C程序。1、通过一种讽刺的手段,来说明编程风格的重要性;2、用怪异的代码来调试C编译器;3、举例说明一些C语言的薄弱或精明之处;4、为脆弱的C代码提供一个安全的讨论会。
Goals of the Contest
Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. b. To darken. 2. To confuse: his emotions obfuscated his judgment. [LLat. obfuscare, to darken : ob(intensive) + Lat. fuscare,to darken < fuscus, dark.] -obfuscation n. obfuscatory adj
To write the most Obscure/Obfuscated C program under the rules below. To show the importance of programming style, in an ironic way. To stress C compilers with unusual code. To illustrate some of the subtleties of the C language. To provide a safe forum for poor C code. :-)
请访问下面的官方网站,如果希望了解更多的相关信息。
http://www.ioccc.org/http://www.au.ioccc.org/
Pi to one MILLION decimal places
http://3.141592653589793238462643383279502884197169399375105820974944592.com/
二、 以下是另一个版本的程序。一样晦涩难懂。(1988年)
Here's another good one:
/* * Program to compute an approximation of pi * by Brian Westley, 1988 * (requires pcc macro concatenation; try gcc -traditional-cpp) */
#define _ -F<00||--F-OO--;int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO(){ _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_}
http://www.comedia.com/hot/jargon-4.2.3/html/entry/Obfuscated-C-Contest.html
这个程序更有意思了,可惜我还不明白其中的原理。希望大家讨论一下,谢谢 !
|
阅读全文(10333) | 回复(1) | 编辑 | 精华 |
回复:一个让人发狂的PI求解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的诧异……………… 下面有个结果的例子: 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185 ……
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
» 1 »
|