***约瑟夫环【列表】

【问题描述】约瑟夫问题,指n个小孩围成一圈,给他们从1开始依次编号,从编号1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩重新开始报数,数到第m个小孩又出列,……,如此反复直到所有的小孩全部出列为止,给出完整的出列顺序。
【输入形式】小孩数量n,周期m
【输出形式】输出数字序列如:1 2 3 4 5
【样例输入】

6

4

【样例输出】4 2 1 3 6 5

【样例说明】
【评分标准】

n = int(input())
m = int(input())

# 初始化小孩列表和出列顺序列表
kids = list(range(1, n+1))
out_order = []

# 开始模拟游戏
i = 0
while len(kids) > 0:
    i = (i + m - 1) % len(kids)   # 计算要删除的小孩的位置
    out_kid = kids.pop(i)         # 删除该小孩,并记录到出列顺序列表中
    out_order.append(out_kid)

# 输出结果
print(' '.join(map(str, out_order)))

以下是一个更为基础的解法

# 输入小孩数量和周期
n = int(input())  # 输入小孩数量
m = int(input())  # 输入周期

# 构造小孩列表
kids = list(range(1, n + 1))

# 初始化计数器和索引
count = 0
index = 0

# 输出出列顺序
while kids:
    count += 1
    # 到达周期时,将当前小孩出列
    if count == m:
        print(kids.pop(index), end=" ")
        # 出列后重置计数器和索引
        count = 0
        index -= 1
    # 小孩列表循环
    index += 1
    if index == len(kids):
        index = 0
print()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值