约瑟夫环——幸运数字【Python】

背景:某一天你穿越到了古代,落到了一个刑场上,正巧碰到古代的皇帝在“杀人”,很不幸,你是其中的一员,但幸运的是,你可以选择自己站的位置。

规则:所有人围成1个圈,从第1个人开始报数,数到3或者3的倍数将被行刑,然后重复,直至剩下最后1个人,无罪释放。幸存者所站的位置,就是幸运数字。

例如:10个人玩游戏,4就是幸运数字。

方法一:索引

# 1. 提示用户录入参与游戏的人数, 并接收
num = eval(input('请录入参与人数: '))

# 2. 根据上述的游戏人数, 生成对应的列表
person_list = list(range(1, num + 1))

# 3. 定义变量, 记录: 列表中当前元素的索引, 以及 数到的数字
i = 0           # 列表中当前元素的索引
count = 1       # 数到的数字

# 4. 开始玩游戏了, 规则是只剩下1个人, 即: 只要列表长度不为1, 则一直循环
while len(person_list) != 1:
    # 5. 如果 i(列表中元素的索引) 已经等于列表的长度了, 就重置索引
    if i == len(person_list):
        i = 0

    # 6. 开始"杀人".
    if count % 3 == 0:
        person_list.pop(i)
        # !细节: 每次"杀人"后, 列表中的后续元素的索引值都会改变, 记得修改索引
        i -= 1

    # 7. 至此, 1个人的判断完毕, 我们判断下个人即可.
    i += 1
    count += 1

# 8. 打印结果
print(f"共有{num} 人, 最终幸存者编号为: {person_list[0]}")

方法二:

p = int(input("共有几人?"))        # 输入总人数
Id, x = list(range(1, p+1)), 0        # 获取每个人的编号
while True:        #
    if len(Id) == 1:        # 编号列表长度为 1说明只剩 1人,即结束循环
        break            
# !细节:Id[:]是创建 Id 的一个副本,这样在代码中对 Id[:] 进行操作,就不会改变 Id 的值。
    for i in Id[:]:        # 遍历编号列表副本
        x += 1             
        if x == 3:        # 当计数为3时
            Id.remove(i)        # 从列表中移除被行刑的编号
            x = 0        # 移除后计数清零
print(Id)                # 打印结果

太详细了~~~

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值