【问题描述】约瑟夫问题,指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()