n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式:
输入两个整数 n,m。
输出格式:
输出一行 n 个整数,按顺序输出每个出圈人的编号。
说明/提示
1<=n,m<=100
流程图展示:

代码展示:
代码初始化:
n,m=map(int,input().split())
ls1=[]
ls2=[]
count=0
n,m=map(int,input().split()):通过用户输入获取两个整数n和m,n代表总人数,m代表每次数到第m个人出列。
ls1=[]:创建一个空列表ls1,用来存储从 1 到n的编号。
ls2=[]:创建一个空列表ls2,用于存储出列人员的编号。
count=0:初始化计数器count,其作用是记录当前数到第几个人。
生成人员编号列表:
for i in range(n):
ls1.append(i+1)
借助for循环,把从 1 到n的编号依次添加到列表ls1中。
模拟出列过程:
while True:
for i in ls1:
count+=1
if i in ls2:
count-=1
if count==m:
if i not in ls2:
ls2.append(i)
count=0
else:
count-=1
if len(ls2)==n:
break
while True:构建一个无限循环,直到所有人都出列才会终止。
for i in ls1:对列表ls1中的每个编号进行遍历。
count+=1:每次遍历,计数器count加 1。
if i in ls2:若当前编号i已经在出列人员列表ls2中,就将计数器count减 1,从而跳过该编号。
if count==m:当计数器count等于m时,意味着数到了第m个人。
if i not in ls2:若当前编号i不在出列人员列表ls2中,就把该编号添加到ls2里,同时将计数器count重置为 0。
else:若当前编号i已经在出列人员列表ls2中,就将计数器count减 1。
if len(ls2)==n:当出列人员列表ls2的长度等于总人数n时,说明所有人都已出列,此时跳出循环。
运行示例:
当n=10,m=3时:


总体代码展示:
n,m=map(int,input().split())
ls1=[]
ls2=[]
count=0
for i in range(n):
ls1.append(i+1)
while True:
for i in ls1:
count+=1
if i in ls2:
count-=1
if count==m:
if i not in ls2:
ls2.append(i)
count=0
else:
count-=1
if len(ls2)==n:
break
for i in range(n):
if i==len(ls2):
print(ls2[i])
else:
print(ls2[i],end=' ')
823

被折叠的 条评论
为什么被折叠?



