假设我们不关心程序的运行时间(对于人类凡人来说实际上是无限的)并且使用有限的内存量(2 ^ 64字节),我们想要在基数10中打印出来,精确值为10 ^(googolplex),屏幕上一次一个数字(大多数为零)。
描述一种算法(可以在当天的计算机上编码),或编写程序来执行此操作。 由于我们实际上无法检查输出,因此我们将依赖集体意见来确定程序的正确性。
注意:我不知道解决方案,或者是否存在解决方案。问题是我自己的发明。那些快速标记这个外在的读者......善意地重新考虑。这很难理论,但肯定是CS。
答案 0 :(得分:8)
这是不可能的。程序中的状态(10 ^(10 ^ 100))多于宇宙中的电子(~10 ^ 80)。因此,在我们的宇宙中,没有能够执行任务的机器的实现。
答案 1 :(得分:5)
首先,我们注意到10 ^(10 ^ 100)相当于(((((10 ^ 10)^ 10)^ ...)^ 10),100次。
或10↑↑↑↑↑↑↑↑↑↑10。
这产生了以下解决方案:
print 1
for i in A(10, 100)
print 0
答案 2 :(得分:1)
这是一个解决这个问题的算法:
print 1
for 1 to 10^(10^100)
print 0
使用Hoare logic:
可以简单地证明正确性i
编辑:解决问题的机器需要能够区分不同状态的一个googolplex:每个状态是打印比前一个更多的结果。执行此操作所需的内存量与存储数字一个googolplex 所需的内存量相同。如果没有那么多可用内存,则无法解决此问题。
这并不意味着它不是一个可计算的问题:它可以通过图灵机解决,因为图灵机具有无限的内存量。
答案 3 :(得分:1)
:
printf 1
while true; do
printf 0
done
......足够接近。
答案 4 :(得分:0)
理论上肯定有这个问题的解决方案,当然假设你有一台能够产生那种输出的机器。我很确定googolplex比宇宙中的原子数大,至少根据物理学家告诉我们的内容,所以我不认为任何可物理实现的计算模型都可以打印出来。但是,从数学上讲,你可以定义一个图灵机,它能够通过给它一个googolplex-ish状态数来打印出这个值,每个状态写一个零,然后移到下一个较低的状态。
答案 5 :(得分:0)
请考虑以下事项:
因此,如果您想模仿程序运行完成的用户体验,请找到要打印到的控制台的最大缓冲区大小并打印多个零。
Hurray懒惰!