点击蓝字 关注我们
真题速递
2022年全国信息素养大赛复赛真题
Python编程题:队列报数
同学们正在练习列队,从第一个人开始按编号1、2、…、n(n<1000)报数,开始所有人都是面向前方,第一遍报数是2的倍数的同学执行一遍向后转命令,第二遍报数是3的倍数的同学执行一遍向后转命令,第三遍报数是5的倍数的同学执行一遍向后转命令,输入人数n,按顺序输出最终仍然面向前方的同学的编号。
输入样例:
10
输出样例:
1
6
7
知识点拆解
1. 列表(数组)的使用
用列表存储n+1个布尔值
2. 循环嵌套
外层循环遍历倍数列表 [2, 3, 5]
[2, 3, 5]
内层循环遍历所有人 range(1, n+1)
range(1, n+1)
注意内外层循环的职责划分
3. 取模运算 %
%
i % 2 == 0判断i是否是2的倍数
i % 2 == 0
注意取模运算的优先级和写法
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)
n = int(input())
s = [-1] * n
for i in range(1,n+1):
if i % 2 == 0:
s[i-1] = 1
if i % 3 == 0:
s[i-1] = s[i-1] * -1
if i % 5 == 0:
if s[i-1] == -1:
print(i)