1.问题描述
魔术师利用一副牌中的13张黑桃,预先将它们排好后叠在一起,并使牌面
朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大
声数数,你们听,不信你们就看。魔术师将从最上面的一张牌开始数,第一张
把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手
中的余牌,第二次数1、2,将第一张牌放在这叠牌的下面,将第二张牌翻过
来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放
在这叠牌的下面,再翻第三张牌正好是黑桃3,这样依次进行,将13张牌全部
翻出来,准确无误。问魔术师手中的牌原始次序是怎样安排的?
2.问题分析
先根据题目描述来分析题意。题目中描述的内容比较多,但已经将魔术师
出牌的过程描述得很清楚了。
假设桌子上有13个空盒子排成一圈,设定其中一个盒子序号为1,将黑桃A
放入1号盒子中,接着从下一个空盒子开始重新计数,当数到第2个空盒子时,
将黑桃2放入其中。然后再从下一个空盒子开始重新计数,数到第3个空盒子
时,将黑桃3放入其中,这样依次进行下去,直到将13张牌全部放入空盒子中
为止。需要注意的是,在计数过程中要跳过那些已放入牌的盒子,而只对空盒
子计数。最后牌在盒子中的顺序就是魔术师手中牌的顺序。
3.算法分析
根据问题分析,使用循环结构来实现程序。使用程序将分析过程模拟出
来,就可以计算出魔术师手中的牌的原始次序。由于有13张牌,因此显然要循
环13次,每次循环时找到与牌序号对应的那个空盒子,因此循环体完成的功能
就是找到对应的空盒子将牌存入。
4.确定程序框架
先定义数组a[14]用于存放13张牌,即相当于问题分析中假定的盒子。
定义变量i、j和n,其中i表示牌的序号,j表示数组的下标(盒子的序
号),n用来记录当前的空盒序号,初值为1。
程序的主体结构为for循环语句,在for循环中实现将13张牌放入数组a的功
能。
1)程序主框架如下:

#外循环13次,每次将一张牌放入空盒中
for i in range(1, 14): # i表示牌的序号
# n用来记录当前的空盒序号,初值为1
n = 1 # 每次都从一个空盒开始重新计数
while n <= i:
# 如果盒子非空,继续找下一个盒子
# 如果盒子为空,判断盒子序号与牌的序号是否相同,相同则存入,不同则继续找

2)将i号牌放入空盒。
该功能使用while循环结构实现,代码如下:

while n <= i:
if j > 13:
j = 1
if a[j]: # 盒子非空,跳过该盒子
j += 1
else:
if n == i: # 判断该盒子是否为第i个空盒
a[j] = i # 是则将i存入
j += 1
n += 1

程序流程图如图2.15所示。

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 猜牌术
if __name__ == '__main__':a = [0] * 14 # 初始化列表,用来存放13张牌j = 1 # j是数组的下标,空盒子的序号print("魔术师手中的牌原始次序是:")# 外循环13次,每次将一张牌放入空盒中for i in range(1, 14): # i表示牌的序号# n用来记录当前的空盒序号,初值为1n = 1 # 每次都从一个空盒开始重新计数while n <= i:if j > 13:j = 1if a[j]: # 盒子非空,跳过该盒子j += 1else:if n == i: # 判断该盒子是否为第i个空盒a[j] = i # 是则将i存入j += 1n += 1print(a[1:])

6.运行结果
在PyCharm下运行程序,结果如图2.16所示。由输出结果可知,魔术师手
中的牌的原始次序是1,8,2,5,10,3,12,11,9,4,7,6,13。

100个python算法超详细讲解:猜牌术相关推荐

  1. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  2. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  3. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  4. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  5. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

  6. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  7. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  8. 100个python算法超详细讲解:孪生素数

    [100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...

  9. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

  10. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

最新文章

  1. 获取服务器路径的方式 【记录】
  2. 时频特性分析(Matlab)
  3. 职业生涯第二年回顾(2011.2~2012.2)
  4. 将hadoop源代码导入eclipse
  5. mysql isnull
  6. python程序间通信_python进程间通信Queue工作过程详解
  7. Linux RT(1)-硬实时Linux(RT-Preempt Patch)在PC上的编译、使用和测试
  8. Office安装时闪退,用Windows Installer Cleanup彻底卸载 或 注册表清理解决
  9. 高中计算机学业水平测试知识点总结,高中生物学业水平测试知识点总结
  10. IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
  11. 系统概念设计的完整性
  12. [《小女人的高跟鞋》偶感小记]2012年8月28日
  13. 【渝粤教育】国家开放大学2018年春季 0553-21T色彩 参考试题
  14. java鼠标经过代码_一段眼睛跟着鼠标转动的跟踪眼代码
  15. Siege——多线程编程最佳实例
  16. Android开发基础规范(一)
  17. Amazon EKS基于GitLab的CICD实践一 GitLab的部署和配置篇
  18. 笔记本电脑,充电器一拔立马关机,突然无法用电池怎么办
  19. 天兔(Lepus)数据库监控系统快速安装部署
  20. loginsight,一款通用的日志分析工具

热门文章

  1. 我的老师,“身怀绝技”!
  2. 显著性检测—谱残差方法分析与实现
  3. 卡尔曼滤波原理及实现
  4. uniapp图片地址以文件流的形式传给后端
  5. 科技查新网站有哪些?
  6. Javascript中的every()与some()的区别和应用
  7. 一些觉得不错的国外Mooc课程
  8. Altium Designer--如何制作过孔(Via)库
  9. 学习SEO 先端正态度
  10. UltraEdit各种wordfile下载