相传,古印度的一位国王对一项新发明的游戏——国际象棋——非常着迷,决定重重奖赏它的发明者,也就是这位聪明的宰相西萨。
当国王问西萨想要什么赏赐时,西萨指着棋盘,提出了一个看似非常谦卑的请求:“陛下,请您在这张棋盘的第1个格子里放1粒麦子,第2个格子里放2粒,第3个格子里放4粒…… 也就是说,后面每一个格子放的麦粒数量,都是前一个格子的两倍。请把这样放满棋盘上64个格子的麦子都赏给我吧。”国王听后哈哈大笑,觉得这个要求太简单、太微不足道了,立刻答应了。
起初,麦粒的数量增长看起来非常温和:
第1格:1粒
第2格:2粒
第3格:4粒
...
第10格:512粒(还不到一小碗)
然而,翻倍的力量是惊人的。到了棋盘的后半部分,数字开始以难以置信的速度膨胀:
第21格:已经需要超过100万粒麦子。
第41格:需要的麦粒数已经超过1万亿。
第64格(最后一格):单独这一格就需要 9,223,372,036,854,775,808粒(约922亿亿粒)。
总量究竟有多惊人?
当国王的粮官开始计算所需麦粒的总数时,所有人都惊呆了。总数是:
18,446,744,073,709,551,615粒 (约1844亿亿粒)。
这个数量意味着:这相当于全世界2000年的小麦总产量。
如果建造一个高4米、宽10米的粮仓来储存,这个粮仓的长度将足以从地球延伸到太阳,再折返回来!
国王根本无法兑现他的诺言,他这才意识到自己小看了数学的力量。
请你编写程序来模拟这个计算过程,输出每一格的麦粒数;并输出64格棋盘所有的麦粒总数。
注意:使用 unsigned long long 来存储巨大的数字
使用for循环,让i从1到64,以此来计算每一格的麦粒数及累加总的麦粒数。
即:unsigned long long sum=0;//设置麦粒总数为0
unsigned long long n=1;//设置当前格子的麦粒数为1
int i;
for (i=1;i<=64;i++)
……