python 菜鸟教程

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

Python练习:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。_python军训时期,教官让n个人站成一圈进行报数。 第一个人从1开始报数,报到3的人离-CSDN博客

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值