魔术师发牌问题 -- python实现

问题描述

魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止.问原来牌的顺序是如何的.

正确结果: [1, 8, 2, 5, 10, 3, 12, 11, 9, 4, 7, 6, 13]

解决方案

1. 列表

def solution_list():
    pokers = [0 for _ in range(13)]         # 初始化
    count = len(pokers)                     # 纸牌总数
    index = -1

    for num in range(1, 14):
        i = 0                               # 计数
        while i < num:
            index = (index + 1) % count     # 索引向前一步(可循环)
            if pokers[index] == 0:          # 当前元素为0时才计数, 不为0则跳过
                i += 1
        pokers[index] = num

    print('#' * 50)
    print(f'\n牌组: {pokers}\n')
    print('#' * 50)

2. 单循环

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值