为大家奉献一篇怪异的c程序求pi的代码

jfet 2000-12-23 03:58:00
求PI精確值的怪異程式


pi1.c(487bytes)/pi2.c(552bytes)
作者:佚名
前者就是被稱為「外星人程式」的求PI小程式..
四行求PI到小數點後八百位..真的不是人寫得出來的.. :Q
後者寫法也是相當奇怪..

---------------------------

/*某年Obfuscated C Contest佳作選錄:*/

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

/*(原程式第一行是int a=10000,b,c....因為在IBM PC
上int只有2-byte,所以我改成long以便各platform都
能run)
能run)
(本程式連可算出pi值連 迭c前共800位)
(本程式節錄自sci.math FAQ,原作者未詳,我猜是外星人 :)*/

运行通过,答案正确

---------------------------

#define _ -F<00||--F-OO--;
long F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_
}

编译通过,但答案不对,为0.267

谁能看得懂啊?


--
※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 202.101.16.172]
发信人: gshawk (明波), 信区: C
标 题: Re: 自认为是C高手的请进(并非讽刺)
发信站: 网易虚拟社区 (Fri Aug 13 11:58:31 1999), 站内信件

【 在 mrcloud (阿豪) 的大作中提到: 】
下面是我运行的情况。
在 Unix 下:
//pi.c pi.c
#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);
}

Sun# gcc -o pi pi.c
Sun# ./pi
3141592653589793238462643383279502884197169399375105820974944592307816
4062862089
9862803482534211706798214808651328230664709384460955058223172535940812
8481117450
2841027019385211055596446229489549303819644288109756659334461284756482
3378678316
5271201909145648566923460348610454326648213393607260249141273724587006
6063155881
7488152092096282925409171536436789259036001133053054882046652138414695
1941511609
4330572703657595919530921861173819326117931051185480744623799627495673
5188575272
5188575272
4891227938183011949129833673362440656643086021394946395224737190702179
8609437027
7053921717629317675238467481846766940513200056812714526356082778577134
2757789609
1736371787214684409012249534301465495853710507922796892589235420199561
1212902196
0864034418159813629774771309960518707211349999998372978049951059731732
8160963185



--
┏━━━━━━━━━━━━━━━━━━━━━┓
│ 厚地高天, 堪叹古今情不尽 , │
│ 痴男怨女, 可怜风月债难偿 ! │
┗━━━━━━━━━━━━━━━━━━━━━┛

※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 202.104.23.10]
发信人: fxw (bare), 信区: C
标 题: Re: 自认为是C高手的请进(并非讽刺)
发信站: 网易虚拟社区 (Fri Aug 13 14:36:12 1999), 站内信件


太高了!
vc下通过!
程序:
#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;
}
结果:
3141592653589793238462643383279502884197169399375105820974944592307816
4062862089
9862803482534211706798214808651328230664709384460955058223172535940812
8481117450
2841027019385211055596446229489549303819644288109756659334461284756482
3378678316
5271201909145648566923460348610454326648213393607260249141273724587006
6063155881
7488152092096282925409171536436789259036001133053054882046652138414695
1941511609
4330572703657595919530921861173819326117931051185480744623799627495673
5188575272
4891227938183011949129833673362440656643086021394946395224737190702179
8609437027
7053921717629317675238467481846766940513200056812714526356082778577134
2757789609
1736371787214684409012249534301465495853710507922796892589235420199561
1212902196
0864034418159813629774771309960518707211349999998372978049951059731732
8160963185








--
--
※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 210.77.38.113]
发信人: girlrong (阿蓉), 信区: C
标 题: Re: 自认为是C高手的请进(并非讽刺)
发信站: 网易虚拟社区 (Sat Aug 14 12:02:04 1999), 站内信件

【 在 mrcloud (阿豪) 的大作中提到: 】
: 求PI精確值的怪異程式
: pi1.c(487bytes)/pi2.c(552bytes)
: 作者:佚名
: 前者就是被稱為「外星人程式」的求PI小程式..
: .......


我把它移植到vc++6.0的win32平台里。不得不加了一点代码。看来这个外星人的
数学水平极好。

void GetPI()
{
int a=10000,b=0,c=2800,d=0,e=0,f[2801],g=0,index=0;
char str[10000];
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,sprintf(str+index,"%.4d",e+d/a),index=strlen(str)
,e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
MessageBox(NULL,str,"",MB_OK);
}
...全文
517 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
myan 2000-12-30
  • 打赏
  • 举报
回复
我将程序改写为以下形式, 比较好看.作为程序员, 我想我也只能做到这一步了,
剩下的工作希望应用数学的高手来继续.

"Obfuscated C Contest"我知道, 参赛者尽可能把代码写得犹如天书. 至于本程序所
用的求PI算法, 未必是该参赛者创造.本程序没有用宏跟递归调用来迷惑大家, 已经
很给面子了. 主要难点如下:
1. 全局变量缺省初始化为0
2. for语句和逗号运算符的结合使用

一般作者参赛, 先找一个特别"玄"的算法,实现之后尽可能把代码改写得乱七八糟,
因此大家一下子理解不了是正常的. 史上最有名的参赛作品是用38行C代码实现一个
BASIC解释器, 然后再用那个BASIC解释器执行了一个"星际旅行"的游戏程序. 窃以为
比这个程序水平高. 有兴趣者请找来Sun公司Peter van de Linden的<C Programming Secretes>看看便知.

#include <stdio.h>
const long a = 10000;
long b = 0,c=2800;
long d=0,e=0,f[2801],g=0;
main(){
int i;
for( i = 0; i < 2801; i++)
f[i]=2000;

// 以下循环执行200次,每次输出4位
for( c = 2800; c != 0; c-=14 ) {
g = c * 2;
d = 0;
b = c;
for(;;) {
d += f[b] * a;
f[b]= d % (--g);
d /= g--;
if (--b == 0)
break;
d *= b;
}
printf( "%.4d", e + d / a);
e = d % a;
}
}
feng_me 2000-12-30
  • 打赏
  • 举报
回复
高人啊。
我调了一夜也没调出来啊。
前两行是初始化数组,后面的那个“,”是什么运算符啊????
大家告诉我吧。
(出乎我意料的是TC2。0竟可以编译通过!!!!!!)
Hank 2000-12-29
  • 打赏
  • 举报
回复
这家伙是怎么写出来的?
The_east_key 2000-12-29
  • 打赏
  • 举报
回复
建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。
NowCan 2000-12-27
  • 打赏
  • 举报
回复
我看过一篇汇编算Pi的程序,任意位,那才是高手,可惜我没看懂。
jfet 2000-12-27
  • 打赏
  • 举报
回复
这段代码我也是在网上看见的,觉得很有意思拿出来和大家分享,我也正在研究这段代码,不过写代码的人的确数学水平和好。
laxin 2000-12-26
  • 打赏
  • 举报
回复
int [2801], 什 么 意 思 ??

对 吗
freeclick 2000-12-25
  • 打赏
  • 举报
回复
#define _ -F<00¦¦--F-OO--;
可以解释一下吗?我愿意奉献我全部得分。。。谢谢先
freeclick 2000-12-25
  • 打赏
  • 举报
回复
#define _ -F<00¦¦--F-OO--;
可以解释一下吗?我愿意奉献我全部得分。。。谢谢先
baobunuo 2000-12-23
  • 打赏
  • 举报
回复
你愿意收弟子吗,baobunuo@sina.com

15,445

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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