当前位置:首页>python>Python编程拆解手记:队列报数

Python编程拆解手记:队列报数

  • 2026-10-11 06:41:57
Python编程拆解手记:队列报数

点击蓝字 关注我们

真题速递

2022年全国信息素养大赛复赛真题

Python编程题:队列报数

同学们正在练习列队,从第一个人开始按编号1、2、…、n(n<1000)报数,开始所有人都是面向前方,第一遍报数是2的倍数的同学执行一遍向后转命令,第二遍报数是3的倍数的同学执行一遍向后转命令,第三遍报数是5的倍数的同学执行一遍向后转命令,输入人数n,按顺序输出最终仍然面向前方的同学的编号。

输入样例:

10

输出样例:

1

6

7

10

知识点拆解

编程知识

1. 列表(数组)的使用

  • 用列表存储n+1个布尔值

2. 循环嵌套

  • 外层循环遍历倍数列表 [2, 3, 5]

  • 内层循环遍历所有人 range(1, n+1)

  • 注意内外层循环的职责划分

3. 取模运算 %

  • i % 2 == 0判断i是否是2的倍数

  • 注意取模运算的优先级和写法

4. 列表遍历输出

  • 最后遍历列表,按顺序输出满足条件的编号

  • 注意输出格式(空格还是换行)

数学知识

1. 倍数与整除

  • 一个数能被另一个数整除,即余数为0

  • 需要理解“2的倍数”、“3的倍数”、“5的倍数”的含义

2. 逻辑状态切换

  • 每次“向后转”就是状态翻转

  • 翻两次等于没翻,翻三次等于翻一次(奇偶性)

  • 这道题本质上是:统计每个编号被翻转的次数,奇数次则朝向改变,偶数次则不变

3. 容斥原理的初步体现(可选延伸)

  • 编号6同时是2和3的倍数,会被翻两次,最终面向前方

  • 编号30同时是2、3、5的倍数,会被翻三次,最终背向前方

  • 这道题不用容斥原理也能做,但如果从数学角度理解,其实就是“每个数被翻了多少次”的问题

讲解视频

点击观看,关注视频号,获取更多真题讲解

完整代码

n = int(input())s = [-1] * nfor i in range(1,n+1):  if i % 2 == 0:    s[i-1] = 1for i in range(1,n+1):  if i % 3 == 0:    s[i-1] = s[i-1] * -1for i in range(1,n+1):  if i % 5 == 0:    s[i-1] = s[i-1] * -1for i in range(1,n+1):  if s[i-1] == -1:    print(i)

最新文章

随机文章