牟晓东

印度有个古老传说:舍罕王打算奖赏国际象棋的发明人——西萨宰相,在被问及想要得到的赏赐时,西萨回答说:“在棋盘的第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格子中米粒的数量求和,其中的“2**i”即“表达式”部分,作用是计算每格中的米粒数量;后面的“for i in range(64)”是“循环”部分,作用是控制完成从0到63共64次循环;sum变量的赋值,是通过内置求和sum()函数来完成的。

之前使用常规循环求和法得到的结果是一个20位长的天文数字,单位是“粒”,不够直观。经查询,1千克大米约有52000粒,通过“mass = int(sum / 52000000)”语句,将这些大米的数目转换成单位为“吨”并进行求整,赋值给mass变量,最后打印输出。

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

棋盘米粒的总数为:184467440737

09551615 粒。

这些米粒的总质量为:3547450783

40 吨。

米粒总数的计算结果与循环求和法一致,它们的总质量是个12位数字,约是3547.5亿吨!中国目前每年产大米约2亿吨,所以国王无论如何也拿不出数量如此庞大的大米,根本就填不满宰相的棋盘。

3.两种方法打印“九九乘法表”

不管是使用常规循环求和还是使用列表推导式,我们都可以正确求解“棋盘米粒倍增”问题,二者在各种问题的求解过程中都比较方便,包括循环的嵌套,比如打印“九九乘法表”。

(1)常规的双层循环嵌套

外层循环语句为“for i in range(1,10):”,作用是从1到9循环;内层循环语句为“for j in range(1,i+1):”,同样是使用range()进行对应次数的循环;循环体语句为“print(‘{0}*{1} = {2}.format(j,i,i*j),end=‘ ) ”,这个print语句用到了Python的format()方法进行字符串格式化,其中的“{0}”、“{1}”和“{2}”是位置参数,作用是将后面“format(j,i,i*j)”中的三个变量的对应数值进行占位输出;“end=‘ ”的作用是設置末尾不换行,而不是print的默认“换行”值;内层循环结束后是一个“print()”空语句,作用是换行,即打印完同一个乘数(比如同是乘以3)的一行循环后,回车换行。

将程序保存为ninenine1.py,运行后得到“九九乘法表”(如图3)。

(2)列表推导式循环嵌套

外层循环语句仍为“for i in range(1,10):”,内层直接就是一个列表推导式(因为本身就是一层循环):“print(“”.join([“%d*%d=%-2d”%(j,i,j*i) for j in range(1,i+1)]))”。这个print语句中的“join()”方法是将序列中的元素以指定的字符连接生成一个新字符串,依次连接到前面的“”空串后面;其中的“%d”的作用是将数据按照整型格式化输出,“-”表示左对齐,“2”表示数字不足两位时进行位数补齐(不足位置用空格)。列表推导式后面的循环部分是“for j in range(1,i+1)”语句,与常规双层循环嵌套的内层循环语句完全相同。

将程序保存为ninenine2.py,运行后,同样也得到了“九九乘法表”(如图4)。

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

  1. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  2. 棋盘麦粒问题编程python_棋盘麦粒问题

    按照那位宰相所要求的方法,在64格棋盘上放置麦粒,表面上看起来所需麦粒数量很少,其实越放越多,最终达到一个天文数量. 每格棋盘应该放置麦粒详细数量: 第1格棋盘: 1=2的0次方 第2格棋盘: 2=2 ...

  3. python求平方根的代码_Python求解平方根的方法

    本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python ...

  4. python 文件名随自变量变化_Python 求解自行车前后轮轨迹问题

    原标题:Python 求解自行车前后轮轨迹问题 转载自:python中文社区 作者:crazyhat,Python及科学计算爱好者. 数月前偶遇一道自行车相关的趣味数学题:根据下图[1]所示自行车前. ...

  5. python汉诺塔游戏_python求解汉诺塔游戏

    本文实例为大家分享了python求解汉诺塔游戏的具体代码,供大家参考,具体内容如下 一.问题定义 百度百科定义:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.据说大梵天创造世界的时候做了三 ...

  6. python象棋棋盘麦粒问题_从零开始学习PYTHON3讲义(五)while循环和棋盘麦粒问题...

    <从零开始PYTHON3>第五讲 ​上一节课重点学习了字符串,并且传递了一个重要的理念,就是程序要对开发人员自己和用户都足够友好.在这个过程中,利用字符串给出充分.完整.准确的提示是非常重 ...

  7. python棋盘覆盖_java实现的棋盘覆盖

    课课家和大家分享一些Java实现的棋盘覆盖的思路:应用分治法 分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题.k&g ...

  8. python log函数怎么打_Python的log日志功能及设置方法

    python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客

  9. python判断素数的函数_Python素数prime函数练习_Python源码实操

    Python素数prime函数练习_Python源码实操 素数prime函数练习 1) 写一个函数isprime(x) 判断x是否为素数,如果是素数,返回True,否则返回False def ispr ...

最新文章

  1. L1-056 猜数字 (结构体解决)
  2. 谷歌浏览器Software Reporter Tool长时间占用CPU解决办法
  3. UNIX再学习 -- 信号
  4. SOCKET,TCP/UDP,HTTP,FTP
  5. Gh0st 3.6 存在的BUG及修改方法(收集整理)
  6. C语言求积标识符,《C语言程序设计》模拟试卷四.doc
  7. java session 同步_session同步
  8. 惯性制导精度是多少_美军激光炸弹真实精度性能:炸小卡车,直接从驾驶员车窗钻进去炸...
  9. Discuz!X/缓存机制和使用方法
  10. “10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
  11. 没有流氓软件,只有流氓行为
  12. 原生js实现一个随机点餐的小效果
  13. 微软在线测试之lucky string,有关斐波那契的题目都在此了
  14. chromium笔记目录
  15. matlab最小二乘法拟合原理,最小二乘法曲线拟合_原理及matlab实现
  16. 修改网页中的内容与打印网页
  17. 报表开发工具ActiveReports实战应用教程——分组报表
  18. URL Scheme的作用是应用间调用
  19. python迅雷下载任务出错_迅雷下载时提示“任务出错”怎么办?小编教你(附多种解决方法)...
  20. CS224N Assignment3 #3: Dependency Parsing(2022 winter)

热门文章

  1. 赞美是感情生活的“保鲜剂”:关于赞美分享的fMRI研究
  2. CDF Chinese Localization SIG
  3. oracle --高级函数应用-pivot (列转行)
  4. 没有一个顺手的流程绘制工具?好吧,自己动手,丰衣足食
  5. 仿牌外贸网店被DMCA移除的解决方案
  6. 达芬奇pro的FPGA学习笔记0--对自己想说的话以及之后的项目规划
  7. 抗生素耐药性革兰氏阴性菌感染的治疗,2020最新IDSA指南
  8. linux切换用户报错timeout,Linux切换用户卡
  9. 表空间离线方法大比较
  10. 城市轨道交通的GoA