第40期-报数

1 问题描述

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,
问最后留下的是原来第几号的那位。
要求:输入围成一圈的人数n
输出最后一个人的编号

2 解题思路

  • 第一步: 输入围成一圈的人数,input函数
  • 第二步: 选哟注意每次出局一人总人数就会少一个,直接计算可能过于复杂,可以选择给他们特殊编号,转完一圈后再统一出局

3 解题方法

第40期-报数
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))
View Code

第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行: 输出剩余的人

代码运行结果为:
第40期-报数

这里用到了try、except语句,简单讲解下这个语句:
try-except 语句(以及其更复杂的形式)定义了进行异常监控的一段代码,并且提供了处理异常的机制.
try 块允许您测试代码块以查找错误。
except 块允许您处理错误。 例如:

try:
  print(x)
except:
  print("An exception occurred")

由于 try 块引发错误,因此会执行 except 块。
如果没有 try 块,程序将崩溃并引发错误
此代码将会输出 An exception occurred

 

上一篇:第42期-猴子分桃


下一篇:first-python-文件的操作和异常010