关于 2014 的最大算式
除夕晚上,我们在某个来往的扎堆群里出了一道关于 2014 的趣味数学题,题目是这样的:
请使用 2、0、1、4 四个数字加上运算符,构造一个算式,使其计算结果尽可能大。数字的顺序可以随意调换,可以使用括号,但不能使用阶乘等单目运算。
题目很简单,比如 2 + 0 + 1 + 4
就是一个可能的解答。不过,这个算式的结果显然太小了。
另外还有一个要注意的是,我们要使用常用的或大家公认的运算符,不能使用偏门的或自定义运算符,不然的话就会有问题。
比如,如果我定义一个运算符 #
,让 a#b
的结果是一个巨大的数字,这样显然可以得到很大的结果,但别人也可以定义更大的运算符,这样的比较恐怕永远不会有结果出来。
同时,我们把阶乘运算(n!)也禁止了,因为这种单目运算可以重复使用,比如:
4210!!!!!!!...
当然,我们可以禁用连阶乘,不过简单起见,我们直接把整个阶乘都禁用了。
传统解
扎堆里很快有人给出了答案:
2^(4^10)
这儿的 ^ 表示乘方运算。
如果只能使用加、减、乘、除、乘方、开方等传统运算符,这大概是能得到的最大算式了,它相当于 \(2^{1048576}\),如果把结果写出来,会是一个长达 31 万位的数字。
使用位运算后的解
不过,既然扎堆中基本都是程序员,大家自然把位运算也用上了。位运算对程序员来说也是一种常见的公认的运算。
位运算中,我们加了一个假设:左移运算(<<)时可以不考虑溢出。在一些编程语言(比如Python)中,的确有这样的特性,只要内存足够,左移永远不会溢出。
如果加上了位运算,注意到左移一位相当于乘以 2,于是我们有了更大的算式:
1<<(2<<40)
这个算式相当于 \(2^{2199023255551}\) ,一个大得惊人的数字。
更多
除了上面的解答,还有不少同学给出了各种有趣的解法。比如:
421/0
这个算式中直接将 0 作为除数,得到的结果可以认为是无穷大,某种程度上说可以秒杀所有其他回答。不过让一个数除以 0 还是比较怪异,这种方案最终被否决了。
另外还有一些方案用到了位运算中的取反操作,比如:
2^(40^~1)
根据 CPU 的不同,~1
得到的结果也不同,但总之会是一个很大的数字。不过,这种方案的值取决于硬件,多少有一些遗憾。
除了取反外,也有同学使用无符号右移来得到一个大数,比如:
4^((0-1)>>>2)
这个方案也很有创意,但结果同样也取决于硬件。
小结
最终我们认为的最佳方案是:
1<<(2<<40)
你有没有更好的方案呢?
评论:
老杰把 RSS Feed 取了?
feed 访问不了啦……
看 HTTP 响应返回301 Moved Permanently。
完整:
curl -I oldj.net/feed
HTTP/1.1 301 Moved Permanently
Date: Mon, 03 Feb 2014 13:57:46 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.22
X-Pingback: http://oldj.net/xmlrpc.php
Last-Modified: Sat, 01 Feb 2014 08:01:28 GMT
ETag: "2e5792432393f9ef8ba0d374ef85b2e2"
Location: http://oldj.net/feed/
Cache-Control: max-age=300
Expires: Mon, 03 Feb 2014 14:02:46 GMT
Vary: Accept-Encoding
Content-Type: text/html
没有取消呢,末尾要加一个“/”,访问地址是 http://oldj.net/feed/ 。
curl -I oldj.net/feed/
HTTP/1.1 200 OK
Date: Wed, 05 Feb 2014 13:18:50 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.22
X-Pingback: http://oldj.net/xmlrpc.php
Last-Modified: Sat, 01 Feb 2014 08:01:28 GMT
ETag: "2e5792432393f9ef8ba0d374ef85b2e2"
Cache-Control: max-age=300
Expires: Wed, 05 Feb 2014 13:23:50 GMT
Vary: Accept-Encoding
Content-Type: text/html