模拟报数游戏(约瑟夫环问题)

【问题描述】

有n个人围成一圈,从1开始按顺序编号,从第一个人开始从1到k报数,报到k的人退出圈子,然后圈子缩小,从下一个人继续游戏,问最后留下的是原来的第几号。

编写程序,模拟上面的游戏,要求初始人数n和报数临界值k可以自由指定。运行程序并观察游戏进行的过程。

【输入形式】

人数n和退出数k
【输出形式】

每轮剩余的人的编号(从第0轮开始)
【样例输入】

10,3
【样例输出】

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[4, 5, 6, 7, 8, 9, 10, 1, 2]
[7, 8, 9, 10, 1, 2, 4, 5]
[10, 1, 2, 4, 5, 7, 8]
[4, 5, 7, 8, 10, 1]
[8, 10, 1, 4, 5]
[4, 5, 8, 10]
[10, 4, 5]
[10, 4]
4
答案的后半截是这样的:

从标准输入设备接收输入并进行类型转化

str_n, str_k = input().split(",")
int_n = int(str_n)
int_k = int(str_k)
int_lst = list(range(1,int_n+1))

调用函数并依据函数的返回值打印

print(demo(int_lst, int_k))

求教!!!

def demo(int_lst, int_k):
    index = 0
    step = int_k  # 从1号开始报数,数到int_k的那个人出列
    print(int_lst)
    while len(int_lst) > 1:
        print(int_lst)
        index = (step - 1) % len(int_lst)  # 列表的索引
        int_lst = int_lst[index + 1:] + int_lst[:index]  # 删除出列的人
        #int_lst.pop(index)
    return int_lst[0]

测试结果截图如下:

img