100个python算法超详细讲解:猜牌术
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算法超详细讲解:猜牌术相关推荐
- 100个python算法超详细讲解:搬山游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...
- 100个python算法超详细讲解:平分7筐鱼
[100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...
- 100个python算法超详细讲解:邮票组合
[100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...
- 100个python算法超详细讲解:递归解决年龄问题
[100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...
- 100个python算法超详细讲解:谁是窃贼
[100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...
- 100个python算法超详细讲解:抢30游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...
- 100个python算法超详细讲解:卡布列克常数
[100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...
- 100个python算法超详细讲解:孪生素数
[100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...
- 100个python算法超详细讲解:狼追兔子
[100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...
- 100个python算法超详细讲解:猴子吃桃
[100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...
最新文章
- 获取服务器路径的方式 【记录】
- 时频特性分析(Matlab)
- 职业生涯第二年回顾(2011.2~2012.2)
- 将hadoop源代码导入eclipse
- mysql isnull
- python程序间通信_python进程间通信Queue工作过程详解
- Linux RT(1)-硬实时Linux(RT-Preempt Patch)在PC上的编译、使用和测试
- Office安装时闪退,用Windows Installer Cleanup彻底卸载 或 注册表清理解决
- 高中计算机学业水平测试知识点总结,高中生物学业水平测试知识点总结
- IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
- 系统概念设计的完整性
- [《小女人的高跟鞋》偶感小记]2012年8月28日
- 【渝粤教育】国家开放大学2018年春季 0553-21T色彩 参考试题
- java鼠标经过代码_一段眼睛跟着鼠标转动的跟踪眼代码
- Siege——多线程编程最佳实例
- Android开发基础规范(一)
- Amazon EKS基于GitLab的CICD实践一 GitLab的部署和配置篇
- 笔记本电脑,充电器一拔立马关机,突然无法用电池怎么办
- 天兔(Lepus)数据库监控系统快速安装部署
- loginsight,一款通用的日志分析工具