python象棋棋盘麦粒问题_Python求解“棋盘米粒倍增”问题

牟晓东

印度有个古老传说:舍罕王打算奖赏国际象棋的发明人——西萨宰相,在被问及想要得到的赏赐时,西萨回答说:“在棋盘的第1格放1粒大米,第2格放2粒,第3格放4粒,之后的每一格中的米粒数目都是相邻前一格的两倍,一直放到最后的第64格,我只要这一棋盘的大米。”

最初国王不以为意,但最终的结果却是举全国之力都无法填满这个棋盘。果真是这样吗?我们使用Python编程来解决这个“棋盘米粒倍增”问题。

1.常规的循环求和法

首先通过“sum = 0”语句建立并为变量sum赋值为0,准备存放最终的米粒数目;接着使用for循环:“for i in range(64):”,其中的range()函数负责提供从0到63共64个循环计数;由于每格中米粒的数目可表示为“2的(n-1)次方”,所以循环体语句为“sum += 2 ** i”,将每次循环得到的该格子中米粒的数量与之前所有格子中米粒的数量和进行求和;循环结束后通过print语句将求和结果输出。

将程序保存为chessrice1.py,运行后得到结果(如图1):

棋盘米粒的总数为:184467440737

09551615 粒。

2.使用列表推导式计算

Python的列表推导式在逻辑上等同于循环语句,优点是形式简洁且速度快,它能够以非常简洁的方式对列表(或其他可迭代对象)中的元素进行遍历、过滤或再次计算,从而快速生成满足特定需求的列表。

Python的列表推导式可分解为“表达式+循环”两部分,比如通过“sum = sum([2**i for i in range(64)])”这一个语句即可完成所有64格子中米粒的数量求

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值