69有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
方法一
n=int(input("请输入总人数:"))
m=int(input("请规定报到数字几的人退出圈子:"))
circle=[] #新建一个圈的列表
for i in range(1,n+1):
circle.append(i)
num=1 #是报数的次数
while len(circle)!=1: #当圈人数不等于1的时候执行
circle.append(circle.pop(0)) #把已报数的人取出放到队尾,以此实现围成圈循环往复
num+=1
if num==m: #如果报的次数等于m,则删除掉这位
del circle[0] #把报到规定数字的人踢出圈子
num=1 #重新从1开始报数
print(circle)
print("最后留下的人是原来第{}号的人".format(*circle))
请输入总人数:10
请规定报到数字几的人退出圈子:3
[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
[4, 5, 6, 7, 8, 9, 10, 1, 2]
[5, 6, 7, 8, 9, 10, 1, 2, 4]
[7, 8, 9, 10, 1, 2, 4, 5]
[8, 9, 10, 1, 2, 4, 5, 7]
[10, 1, 2, 4, 5, 7, 8]
[1, 2, 4, 5, 7, 8, 10]
[4, 5, 7, 8, 10, 1]
[5, 7, 8, 10, 1, 4]
[8, 10, 1, 4, 5]
[10, 1, 4, 5, 8]
[4, 5, 8, 10]
[5, 8, 10, 4]
[10, 4, 5]
[4, 5, 10]
[10, 4]
[4, 10]
[4]
最后留下的人是原来第4号的人
方法二
n = int(input('输入数字:')) # 输入数字
a = list(range(1, n + 1)) # 建立一个列表,存放的是号码数
count = 0 # 构造一个全局变量,使得其储存每一位报的数
while len(a) > 1: # 循环直到列表只剩一个元素
b = a[:] # 复制列表,为下一步删除做准备
for i in range(0, len(b)): # 在len(b)的次数中,计数,并去除数
count += 1 #count一直累加,代表报数一直累加,是三或者3的倍数的时候踢出去
if count % 3 == 0: # 如果报三,则去除a中的这一位
a.remove(b[i])
print(a)
输入数字:10
[1, 2, 4, 5, 7, 8, 10]
[1, 4, 5, 8, 10]
[4, 5, 10]
[4, 10]
[4]
方法三
def who_remain(n):
lst = [i for i in range(1,n+1)] # 构造一个列表
while n > 2:
lst.pop(2) # 弹出第三个元素
before = lst[:2] #弹出后把前两个元素移到最后
lst = lst[2:]
lst.extend(before)
n = len(lst) #下一次循环就从原来的4号(即现在的1号开始)
print(lst[1])
who_remain(10)
4