问题背景
相传国际象棋是古印度舍罕王的宰相达依尔发明的。
舍罕王十分喜爱国际象棋,便决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8×8 共 64 格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第 1 格中放 1 粒,第 2 格放 2 粒,第 3 格放 4 粒,以后每一格都比前一格增加一倍,依此放完棋盘上 64 格,我就感激不尽了……
舍罕王听了达依尔这个“小小”的要求,便让人扛来一袋麦子,他要兑现许诺。结果,在给达依尔发放麦子时,舍罕王发现他要给达依尔的麦子比自己想象的要多得多,一袋麦子是远远不够的……
问题背景文案来自🐟c论坛
问题分析
这是一个经典的数学问题,在格子的第一格放上1粒麦子,第二格放上2粒,第三格放上4粒……你会发现其实就是2的n-1次方。
这种看似数值小实际却非常庞大的运算,在现实生活中是非常难完成的。但是,计算机不同,计算机能轻而易举的计算出摆满整个棋盘所需要的麦子总数。
算法代码
i = 1
sum = 0
while i <= 64:
wheats = 2 ** (i-1)
sum = sum + wheats
i = i + 1
print("舍罕王应该赏赐", sum, "粒麦子")
运行结果
代码分析
int=1
sum = 0
变量i代表了棋盘的格数,sum代表目前麦粒的总数
wheats = 2 ** (i-1) #wheats = pow(2,i-1)
这行是计算第i格的麦粒数, ** 是指数运算。我们也可以用pow函数代替,pow中分别是(底数,指数);如果是pow(a,b,c)这种情况,则为a**b%c的运算。
print("舍罕王应该赏赐", sum, "粒麦子")
sum是一个数字,不能和字符串一起输出,所以需要以上格式来进行输出。
使用print(“舍罕王应该赏赐”+sum+“粒麦子”)是不对的,会出现报错。
还可以使用print(“舍罕王应该赏赐”+str(sum)+“粒麦子”)这样是能够输出的
运行结果如下:
总结
在这个算法中,只需要将数学问题抽象表达出来即可,涉及的知识点不难,只要将题中的指数运算表示出来,还有最后print中的连接关系弄清即可。