古时候,印度有个国王很爱玩。一天,他对大臣们说,希望得到一种玩不腻的玩意儿,谁能贡献给他,将有重赏。
不久,有个聪明的大臣向他献上一种棋子,棋盘上有64个格子,棋子上刻着“皇帝”、“皇后”、“车”、“马”、“炮”等字。下这种棋子,是玩一种变化无穷的游戏,确实让人百玩不厌。国王就对那个聪明的大臣说:“我要重赏你。说吧,你要什么,我都能满足你。”
那个大臣说:“我只要些麦粒。”
“麦粒?哈,你要多少呢?”
“国王陛下,你在第一格棋盘上放1粒,第二格上放2粒,第三格上放4粒,第四格上放8粒……照这样放下去,把64格棋盘都放满就行了。”
国王想:这能要多少呢?最多几百斤吧。小意思,就对管粮食的大臣说:“你去拿几麻袋的麦子赏给他吧。”
管粮食的大臣计算了一下,忽然大惊失色,忙向国王报告道:“照这样的计算,把我们全国所有的粮食全给他,还差得远呢!”
说完把计算题列给国王看,得数等于18,446,774,073,709,551,615(颗麦粒)
1立方米麦粒大约有1500万粒,那么照这样计算,得给那位大臣12000亿立方米,这些麦子比全世界2000年生产的麦子的总和还多。
#include <stdio.h>
#define SQUARES 64
int main(void)
{
const double CROP = 2E16; // 世界小麦年粒数
double current, total;
int count = 1;
printf("square grains total ");
printf("fraction of \n");
printf(" added grains ");
printf("world total\n");
total = current = 1.0;
printf("%4d %13.2e %12.2e %12.2e\n", count, current, total, total / CROP);
while (count < SQUARES) {
count = count + 1;
current = 2.0 * current; // 谷粒翻倍
total = total + current;
printf("%4d %13.2e %12.2e %12.2e\n", count, current, total, total / CROP);
}
printf("That's all.\n");
return 0;
}
square grains total fraction of
added grains world total
1 1.00e+00 1.00e+00 5.00e-17
2 2.00e+00 3.00e+00 1.50e-16
3 4.00e+00 7.00e+00 3.50e-16
4 8.00e+00 1.50e+01 7.50e-16
5 1.60e+01 3.10e+01 1.55e-15
6 3.20e+01 6.30e+01 3.15e-15
7 6.40e+01 1.27e+02 6.35e-15
8 1.28e+02 2.55e+02 1.27e-14
9 2.56e+02 5.11e+02 2.55e-14
10 5.12e+02 1.02e+03 5.12e-14
11 1.02e+03 2.05e+03 1.02e-13
12 2.05e+03 4.10e+03 2.05e-13
13 4.10e+03 8.19e+03 4.10e-13
14 8.19e+03 1.64e+04 8.19e-13
15 1.64e+04 3.28e+04 1.64e-12
16 3.28e+04 6.55e+04 3.28e-12
17 6.55e+04 1.31e+05 6.55e-12
18 1.31e+05 2.62e+05 1.31e-11
19 2.62e+05 5.24e+05 2.62e-11
20 5.24e+05 1.05e+06 5.24e-11
21 1.05e+06 2.10e+06 1.05e-10
22 2.10e+06 4.19e+06 2.10e-10
23 4.19e+06 8.39e+06 4.19e-10
24 8.39e+06 1.68e+07 8.39e-10
25 1.68e+07 3.36e+07 1.68e-09
26 3.36e+07 6.71e+07 3.36e-09
27 6.71e+07 1.34e+08 6.71e-09
28 1.34e+08 2.68e+08 1.34e-08
29 2.68e+08 5.37e+08 2.68e-08
30 5.37e+08 1.07e+09 5.37e-08
31 1.07e+09 2.15e+09 1.07e-07
32 2.15e+09 4.29e+09 2.15e-07
33 4.29e+09 8.59e+09 4.29e-07
34 8.59e+09 1.72e+10 8.59e-07
35 1.72e+10 3.44e+10 1.72e-06
36 3.44e+10 6.87e+10 3.44e-06
37 6.87e+10 1.37e+11 6.87e-06
38 1.37e+11 2.75e+11 1.37e-05
39 2.75e+11 5.50e+11 2.75e-05
40 5.50e+11 1.10e+12 5.50e-05
41 1.10e+12 2.20e+12 1.10e-04
42 2.20e+12 4.40e+12 2.20e-04
43 4.40e+12 8.80e+12 4.40e-04
44 8.80e+12 1.76e+13 8.80e-04
45 1.76e+13 3.52e+13 1.76e-03
46 3.52e+13 7.04e+13 3.52e-03
47 7.04e+13 1.41e+14 7.04e-03
48 1.41e+14 2.81e+14 1.41e-02
49 2.81e+14 5.63e+14 2.81e-02
50 5.63e+14 1.13e+15 5.63e-02
51 1.13e+15 2.25e+15 1.13e-01
52 2.25e+15 4.50e+15 2.25e-01
53 4.50e+15 9.01e+15 4.50e-01
54 9.01e+15 1.80e+16 9.01e-01
55 1.80e+16 3.60e+16 1.80e+00
56 3.60e+16 7.21e+16 3.60e+00
57 7.21e+16 1.44e+17 7.21e+00
58 1.44e+17 2.88e+17 1.44e+01
59 2.88e+17 5.76e+17 2.88e+01
60 5.76e+17 1.15e+18 5.76e+01
61 1.15e+18 2.31e+18 1.15e+02
62 2.31e+18 4.61e+18 2.31e+02
63 4.61e+18 9.22e+18 4.61e+02
64 9.22e+18 1.84e+19 9.22e+02
That's all.