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格子中米粒的数量求

你可能感兴趣的:(python象棋棋盘麦粒问题)