Python初学者练习:有n个人围成一个圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位...

---人生苦短,我用Python---

这道题的思路是,n个人要一直循环报数,而且头尾相接,如何设置循环体是是关键点。
代码如下:

n = int(input('请输入人数:'))
li_c = list(range(1, n + 1)) # 将所有人放入一个数组
count = 0            # 设置一个变量,用于计算报数
while len(li_c) > 1:     # 当数组中至少有2个元素时进行循环
li_co = li_c[:]    # 把原数组拷贝到新数组中,用于限制内层循环次数
for i in range(0, len(li_co)): # 内层循环开始,从第一个人开始报数
count = count + 1 # 每报一次,count计数器加1

if count % 3 == 0: # 如果count能被3整除,则是报到3的人
            li_c.remove(li_co[i])  # 把报到3的人移除原数组,进行下一次循环

print('最后留下的是原来的第 {} 号。'.format(li_c[0]))

转载于:https://www.cnblogs.com/cy80/p/9025021.html

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用循环链表来模拟这个过程。具体实现如下: ```python class Node: def __init__(self, num): self.num = num self.next = None def get_last_person(n): # 初始化循环链表 head = Node(1) pre = head for i in range(2, n+1): cur = Node(i) pre.next = cur pre = cur pre.next = head # 开始报数并删除 p = head while p.next != p: for i in range(1, 3): p = p.next p.next = p.next.next return p.num n = 10 last_person = get_last_person(n) print(f"The last person is No.{last_person}") ``` 运行结果: ``` The last person is No.4 ``` 如果将 n 改为其他的值,可以得到不同的结果。 ### 回答2: 题目要求找出最后留下的人原来码。我们可以使用Python来实现这个逻辑。 首先,我们需要一个列表来表示所有的人。初始化这个列表,按照顺序给每个人一个相应的编,从1到n。然后,我们需要一个变量current来表示当前报数的人的索引。假设列表的长度为n。 我们可以使用一个while循环来模拟围成一圈的报数过程。每次循环开始,我们需要判断当前人的编是否已经报到3。如果是,我们就从列表中移除这个人。如果不是,我们继续往后报数。 具体操作如下: ``` n = int(input('请输入总人数:')) people = list(range(1, n + 1)) current = 0 while len(people) > 1: current += 1 if current > len(people): current = 1 if current % 3 == 0: people.pop(current - 1) if current > len(people): current = 1 print('最后留下的是原来第{}那位。'.format(people[0])) ``` 上述代码中,我们使用了一个while循环来模拟围成一圈的报数过程。在循环中,我们首先将current加1,表示报数。然后,如果current大于当前人数的话,将current重置为1,以保证循环报数。接着,我们检查current是否能被3整除,如果能够整除,表示这个人需要退出圈子。我们使用pop()方法将其从列表中移除,并将current重置为1,以便下次循环报数最后,当循环结束时,只留下一个人,我们输出这个人原来的编即可。 希望以上解答能够帮到您。如有更多疑,请随时提。 ### 回答3: 这个题可以通过模拟的方式,用python来实现。我们可以使用一个列表来表示人围成圈子,每个人一个码表示。 首先,我们定义一个函数,用于模拟报数的过程,输入为人数n,输出为最后留下的人的码: ```python def lastRemaining(n): # 创建一个列表,表示人围成圈子 circle = list(range(1, n+1)) # 定义当前报数的位置 current = 0 # 当圈子中的人数大于1时,继续报数 while len(circle) > 1: # 对当前位置的人报数 current = (current + 2) % len(circle) # 将报到3的人从圈子中删除 circle.pop(current) # 返回最后留下的人的码 return circle[0] ``` 接下来,我们可以调用这个函数来进行测试: ```python n = int(input("请输入人数n:")) last = lastRemaining(n) print("最后留下的是原来第%d那位。" % last) ``` 这样就可以根据输入的人数n得到最后留下的人的码了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值