舍罕王的失算(象棋棋盘摆麦子问题)

问题背景

相传国际象棋是古印度舍罕王的宰相达依尔发明的。
舍罕王十分喜爱国际象棋,便决定让宰相自己选择何种赏赐。这位聪明的宰相指着 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中的连接关系弄清即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值