自学Python:破解魔术师手中的牌
魔术师利用一副牌中的13张黑桃,预先将它们排好后叠在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大声数数,你们听,不信你们就看。魔术师将从最上面的一张牌开始数,第一张把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的余牌,第二次数1、2,将第一张牌放在这叠牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这叠牌的下面,再翻第三张牌正好是黑桃3,这样依次进行,将13张牌全部翻出来,准确无误。
请问魔术师手中的牌原始次序是怎样安排的?
拆解问题如下:假设桌子上有13个空盒子排成一圈,设定其中一个盒子序号为1,将黑桃A放入1号盒子中,接着从下一个空盒子开始重新计数,当数到第2个空盒子时,将黑桃2放入其中。然后再从下一个空盒子开始重新计数,数到第3个空盒子时,将黑桃3放入其中,这样依次进行下去,直到将13张牌全部放入空盒子中为止。需要注意的是,在计数过程中要跳过那些已放入牌的盒子,而只对空盒子计数。最后牌在盒子中的顺序就是魔术师手中牌的顺序。
下面直接上代码:
########################
if __name__ == '__main__':
a = [0] * 14 # 初始化列表,用来存放13张牌
j = 1 # j是数组的下标,空盒子的序号
print("魔术师手中的牌原始次序是:")
# 外循环13次,每次将一张牌放入空盒中
for i in range(1, 14): # i表示牌的序号
# n用来记录当前的空盒序号,初值为1
n = 1 # 每次都从一个空盒开始重新计数
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
print(a[1:])
########################
执行结果如下:
魔术师手中的牌原始次序是:
[1, 8, 2, 5, 10, 3, 12, 11, 9, 4, 7, 6, 13]
________________END______________