第40期-报数
1 问题描述
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,
问最后留下的是原来第几号的那位。
要求:输入围成一圈的人数n
输出最后一个人的编号
2 解题思路
- 第一步: 输入围成一圈的人数,input函数
- 第二步: 选哟注意每次出局一人总人数就会少一个,直接计算可能过于复杂,可以选择给他们特殊编号,转完一圈后再统一出局
3 解题方法
n = int(input('请输入围成一圈的人数:')) a = [] for i in range(n): a.append(i + 1) def count(a): i = 2 while True: if len(a) == 2: if i == 1: return a[0] else: return a[1] a[i] = 0 i += 3 if i >= len(a): i -= len(a) while True: try: a.remove(0) except: break print(count(a))
第1行: 使用input函数提示用户输入围成一圈的人的数量,并赋值给n
第2-4行: 定义列表a,将人数从1到n加到列表中
第7行: 定义函数count,其内变量为列表a
第8行: 定义索引变量i,因为第一个出局的玩家在列表中的索引为2,所以给i赋值为2
第10-14行: 当列表长度为2时,可能会出现减去列表长度结果仍然超出列表长度的情况,所以对列表长度为2的情况需要特别考虑
第15行: 将即将出局的人标记为0
第16行: 索引加3进行下次标记
第17-18行: 当索引大于或等于列表长度时,无法索引,需要循环到列表开头
第19行: 此时单次列表索引完毕,开始清除所有为0的玩家,无限循环,开始将0踢出列表
第20-23行: 一直删除0知道没有0可以删除,结束本次内部循环
第26行: 输出剩余的人
代码运行结果为:
这里用到了try、except语句,简单讲解下这个语句:
try-except 语句(以及其更复杂的形式)定义了进行异常监控的一段代码,并且提供了处理异常的机制.
try 块允许您测试代码块以查找错误。
except 块允许您处理错误。 例如:
try: print(x) except: print("An exception occurred")
由于 try 块引发错误,因此会执行 except 块。
如果没有 try 块,程序将崩溃并引发错误
此代码将会输出 An exception occurred