Bignum Bakeoff
来自Googology Wiki
更多操作
Bignum Bakeoff 是由 David Moews 于 2001 年 12 月举办的大数编程竞赛。
比赛的目标是编写一个不超过 512 个字符(忽略空格)的 C 程序,该程序能够从 main() 函数返回尽可能大的数字。
详细规则[1]
- 程序必须使用 C90 编写,即 1990 年 C 标准 ANSI/ISO 9899-1990,并遵守以下约束: (a) 禁止使用浮点常量、
float
、double
、long double
或其他浮点类型。 (b) 禁止使用实现定义行为、本地化特定行为或未定义行为,除非在下面的第 7 条中有定义。 (d) 禁止使用字符常量或字符串字面值。 (e) 禁止使用位域。 (f) 禁止查看argc
、argv
或环境变量。程序必须是确定性的且自包含的。 (g) 当右操作数(称为b
)满足((int)b) < 0
时,禁止使用/
或%
。 (h) 禁止使用标准库,除了以下内容:size_t
,ptrdiff_t
,NULL
,offsetof()
,jmp_buf
,setjmp()
,longjmp()
,div_t
,ldiv_t
,calloc()
,free()
,malloc()
,realloc()
,bsearch()
,qsort()
,abs()
,div()
,labs()
,ldiv()
,memcpy()
,memmove()
,strcpy()
,strncpy()
,strcat()
,strncat()
,memcmp()
,strcmp()
,strncmp()
,memchr()
,strchr()
,strcspn()
,strpbrk()
,strrchr()
,strspn()
,strstr()
,strtok()
,memset()
,strlen()
。 - 程序长度不得超过 512 个字符,不计空白字符。空白字符包括空格、制表符、换行符、换页符和回车符。
- 程序的输出数字是
main()
函数返回的数字。如果无法证明您的程序会从main()
返回,它将无法获胜。 - 从
main()
返回绝对值最大数字的程序将获胜。如果存在一组程序,无法确定其中哪个程序返回的数字最大,则该组所有程序将共同获胜。 - 参赛者可以提交任意数量的解释性文本,以证明其程序会从
main()
返回、解释其返回的数字有多大,或出于任何其他原因。 - 参赛作品必须通过电子邮件发送至 dmoews@xraysgi.ims.uconn.edu,并需在太平洋标准时间 2001 年 12 月 31 日 23:59:59 之前收到。收到您的作品后,将通过电子邮件进行确认。
- 程序将被视为在具有无限内存和无限大整数的虚拟机上进行编译和运行。具体细节如下: (a) 所有整数类型
T
(char
,signed char
,unsigned char
,short int
,unsigned short int
,int
,unsigned int
,long int
,unsigned long int
) 都满足sizeof(T) == 1
。 (b)char
默认是有符号的。 (c) 所有有符号整数类型都可以容纳任意大的整数(正数、负数或零)。整数以二进制补码形式表示,因此可以视为向左无限延伸的比特串:47 = ...0000000000010111
5 = ...0000000000000101
-3 = ...1111111111111101
-5 = ...1111111111111011
(d) 无符号整数类型持有与有符号整数类型相同的比特串,但它们被视为无符号数。 (e) 从有符号整数类型到无符号整数类型的转换(无论是隐式的还是通过强制转换)都会保留被转换数字的比特串表示。就标准第 6.2.1.5 节而言,long int
无法表示unsigned int
的所有值。 (f) 一元+
、一元-
、二元+
、二元-
、二元*
、==
和!=
在有符号整数类型上按照通常的数学方式运算。对于有符号数a
和b
,如果b>0
,a / b
总是返回小于或等于a
除以b
的最大整数;如果b<=0
,则未定义。如 C 标准所要求,a % b
等于a - (a/b)*b
。在无符号整数类型上,这些运算符的行为如同操作数被强制转换为有符号类型,结果又被强制转换回无符号类型。 (g)<
,<=
,>
,>=
对有符号整数类型的操作数按其数学值排序。对于无符号整数类型,排序是基于比特串的字典序,即:-1 > -2 > -3 > -4 > ... > 4 > 3 > 2 > 1 > 0
。 (h) 对于~
、二元&
、|
和^
,其结果的值是使用比特串表示按位计算得出的。 (i) 令POW(2,b)
表示 2 的b
次方。对于有符号整数类型a
和b
,a << b
定义为:若b>=0
则为a*POW(2,b)
,若b<0
则为a/POW(2,-b)
;a >> b
定义为:若b<=0
则为a*POW(2,-b)
,若b>0
则为a/POW(2,b)
。对于无符号整数类型a
和b
,结果等同于先将a
和b
强制转换为有符号类型,计算后再将结果强制转换回无符号类型。 (j)size_t
将被视为等同于unsigned int
。ptrdiff_t
将被视为等同于int
。
参赛程序
TO DO: 参赛程序
参考资料
- ↑ Moews, D. (2001). Bignum rules posted. (EB/OL). https://djm.cc/bignum-rules-posted.txt