[题目描述]
n 个人( 0,1,2,3,4...n−1 ),围成一圈,从编号为 k 的人开始报数,报数报到 m 的人出队。
下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人就是大王。现在,给定 n ,k ,m 。
请你求出大王的编号。
输入格式:
输入一行包含三个整数 n , k , m 。
输出格式:
输出一个整数。
样例输入
5 1 2
样例输出
3
数据范围:
对于 100% 的数据,保证 1≤n≤100,1≤k≤n−1,1≤m≤100 。
来源/分类(难度系数:一星)
完整代码展示:
n,k,m=map(int,input().split())
a=[]
for i in range(0,n):
a.append(i)
a1=a[0:k]
a2=a[k::]
a=a2+a1
while len(a)>1:
a3=a[0:m-1]
a4=a[m::]
a=a4+a3
print(a[0])
代码解释:
“n,k,m=map(int,input().split()) ”,让用户输入总人数n,开始报数的人的编号k和给定的需出列的人的报数m。
“a=[]
for i in range(0,n):
a.append(i) ”,建立一个空列表a,接着将从0~n-1编号的n个人依次添加进列表a中。
“a1=a[0:k]
a2=a[k::]
a=a2+a1 ”,令a1=a[0:k],a2=a[k::],接着将a[2]+a[1]重新赋给a(注意:是a=a2+a1,不是a=a1+a2),本段代码意义在于将编号为k的人调到列表首位,作为报数的第一个人。
“while len(a)>1:
a3=a[0:m-1]
a4=a[m::]
a=a4+a3 ”,当列表a中元素数量大于1时(即len(a)>1),令a3=a[0::m-1],a4=a[m::],接着将a4+a3重新赋给a。当len(a)==1时,跳出整个while循环。(本段代码意义在于从列表首开始报数,然后将每次报数为m的元素删除,接着让报数为m的元素的后面一位元素作为列表首)。
“print(a[0]) ”,打印a[0]。(即最后一个人)
运行效果展示:
(声明:以上内容均为原创)
标签:OJ,python,约瑟夫,a1,a3,a2,a4,列表,报数 From: https://blog.csdn.net/2401_83954530/article/details/141069295