背景:某一天你穿越到了古代,落到了一个刑场上,正巧碰到古代的皇帝在“杀人”,很不幸,你是其中的一员,但幸运的是,你可以选择自己站的位置。
规则:所有人围成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) # 打印结果
太详细了~~~