美文网首页日更成长营自学编程Python
自学Python:破解魔术师手中的牌

自学Python:破解魔术师手中的牌

作者: 小强聊成长 | 来源:发表于2021-11-28 09:50 被阅读0次

    魔术师利用一副牌中的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______________

    相关文章

      网友评论

        本文标题:自学Python:破解魔术师手中的牌

        本文链接:https://www.haomeiwen.com/subject/wlzntrtx.html