内容正文:
2022年全国青少年信息素养大赛Python
国赛
1、分苹果
题目背景:
把一堆苹果分给n个小朋友,每个人拿到的苹果数量不同,并且每个人至少有
一个。
任意输入小朋友的数量n,问这堆苹果至少应该有多少个。
输入描述:
任意输入小朋友的数量n
输出描述:
输出这堆苹果至少应该有多少个
样例输入:
3
样例输出:
6
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
2、韩信点兵
题目背景:
韩信点兵又称为中国剩余定理,相传汉高祖刘邦问大将军韩信统御士兵多
少,韩信答说,每3人一列余2人、5人一列余4人、7人一列余6人。
输入任意一个数字n(0<=n<=10000)表示刘邦总共的兵力,计算韩信可能统
御的士兵数量并依次输出。
输入描述:
输入任意一个数字n(0<=n<=10000)表示刘邦总共的兵力
输出描述:
计算韩信可能统御的士兵数量并依次输出,每行一个,从小到大
样例输入:
500
样例输出:
104
209
314
419
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
# 方法1,变量法
n = int(input())
s = 0
for i in range(1, n + 1):
s += i
print(s)
1
2
3
4
5
6
3、借书问题
题目背景:
小明家里有很多不同的趣味书籍,有3个好朋友每人来借—本书(同—本书一
次不能借给两个人)
任意输入书籍的数量n(3<=n<=100),输出在所有的书籍中,找3本书给3个人
有多少种不同的排列组合方法
输入描述:
任意输入书籍的数量n(3<=n<=100)
输出描述:
输出在所有的书籍中,找3本书给3个人有多少种不同的排列组合方法
样例输入:
3
样例输出:
6
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
# 将输入的数字转成整数
n = int(input())
# 使用枚举算法,判断每个数字是否同时满足3个条件
for i in range(n + 1):
if i % 3 == 2 and i % 5 == 4 and i % 7 == 6:
print(i)
1
2
3
4
5
6
7
4、四位数密码
题目背景:
情报员使用4位数字来传递信息,同时为了防止信息泄露,需要将数字进行加
密。数据加密的规则是:
1). 每个数字都进行如下处理:该数字加上5之后除以10的余数,替换原数
字;
2). 将处理后第一位数字与第三位数字进行交换,第二位数字与第四位数字进
行交换;
3). 现在任意输入一个四位数n(1000 <= n <= 9999),输出加密之后的数字。
输入描述:
一个四位数
输出描述:
加密后的四位数
样例输入:
1234
样例输出:
8967
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
# 方法1,数学方法
n = int(input())
print(n * (n - 1) * (n - 2))
1
2
3
n = int(input())
# 分别获取个位、十位、百位和千位
1
2
5、邮票面值
题目背景:
我们在寄信的时候都要贴邮票,在邮局有一些小面值的邮票,通过这些小面
值邮票中的一张或者几张的组合,可以满足不同邮件的不同邮资。
已知每个信封上 多能贴5张邮票,邮票的种类至少需要3种,任意输入一个
数字n代表邮票的种类,然后依次输入n个数字代表不同种类的邮票面值,计算并
输出每个信封上可以构成的邮资的 大值。
输入描述:
第一行输入一个数字n代表邮票的种类;
然后依次输入n行数字代表n个不同种类的邮票面值;
输出描述:
输出每个信封上可以构成的邮资的 大值。
样例输入:
4
1
2
3
gw = n % 10
sw = n // 10 % 10
bw = n // 100 % 10
qw = n // 1000
# 加密处理
gw = (gw + 5) % 10
sw = (sw + 5) % 10
bw = (bw + 5) % 10
qw = (qw + 5) % 10
# 数字交换
gw, bw = bw, gw
sw, qw = qw, sw
# 直接输出
print(qw,bw,sw,gw,sep="")
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4
样例输出:
17
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
6、取球
题目背景:
一个箱子里面存放着50个球,其中10个红色,10个黄色,30个蓝色。
现在从箱子里面任意取n个球,计算并输出不同颜色的球的数量组合一共有多
少种可能性。
输入描述:
一个数字n
输出描述:
一个数字,可能的组合总数
# 获取数字n
n = int(input())
# 定义列表stamps,用于保存不同的面值
stamps = []
# 依次输入不同邮票面值,并存入列表中
for i in range(n):
stamps.append(int(input()))
# 对列表进行排序
stamps.sort()
# 取最后三项,其中最后一项取3次
_max = sum(stamps[-3:]) + stamps[-1] * 2
print(_max)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
样例输入:
2
样例输出:
6
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
7、统计连续字符
题目背景:
依次输入一个字符串s与一个数字n,寻找字符串中所有连续出现n次的字符,
统计符合要求的字符数量并输出。
例如输入abbcccdddd,输入2,字符串中连续出现2次的字符包括b、c、d这3
种。
输入描述:
第一行一个字符串(保证有连续的n个字符)
第二行一个数字n
输出描述:
# 获取数字n
n = int(input())
# 枚举算法
result = []
for x in range(10):
for y in range(10):
for z in range(30):
if x + y + z == n and (x,y,z) not in result:
result.append((x,y,z))
# 输出组合总数
print(len(result))
1
2
3
4
5
6
7
8
9
10
11
符合要求的字符数量
样例输入:
abbcccdddd
2
样例输出:
3
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
8、n的n次方
题目背景:
# 获取字符串
s = input()
# 获取数字n
n = int(input())
res = []
i = 0
while i < len(s):
j = i + 1
# 判断前后连个字符是否相等
while j < len(s) and s[i] == s[j]:
j += 1
# 将连续字符取出来,存入到列表中
res.append(s[i:j])
i = j
# 对结果进行过滤
res = [r for r in res if len(r) >= n]
# 输出次数
print(len(res))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
当数字的位数高达上百位时,这样庞大的数字在计算机中的计算已经完全不
能用简单的加减乘除来实现了,但是有时候对于这种高精度数字的处理也是编程
中必不可缺的。
任意输入―个数字n (99999 < n < 999999),计算n的n次方(即连续n个n相
乘)计算之后, 后的3位数字是多少。
输入描述:
―个数字n (99999 < n < 999999)
输出描述:
计算n的n次方(即连续n个n相乘)之后, 后的3位数字是多少
样例输入:
123456
样例输出:
856
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
9、海盗搜身
题目背景:
—群渔民被海盗抓住了,依次坐在编号为1~n的凳子上,其中有一个人身上
有藏宝图。
现在海盗想要找那个身上带着宝藏的渔民,海盗先将1号凳子上面的人搜身,
没找到就隔1个凳子,将3号凳子上面的人搜身,没找到就隔2个凳子,将6号凳子
上面的人搜身。
n = int(input())
# 计算乘法,然后取余数
p = n ** n % 1000
print("%03d"%p)
1
2
3
4
以后每次多隔一个凳子去搜索......这样下去找了100次没找到, 终放弃了把
渔民释放了。
任意输入一个数字n(5 <= n <= 20)代表渔民的数量,依次输出哪些编号的渔
民不会被搜身。
输入描述:
任意输入一个数字n(5 <= n <= 20)代表渔民的数量
输出描述:
依次输出哪些编号的渔民不会被搜身,每行一个
样例输入:
10
样例输出:
2
4
7
9
注意:
input()内不添加任何参数
n = int(input())
peo = [i+ l for i in range(n)]
# 100次查找
j=0
step = 2
for i in range(100):
peo[j] = -1
j= (j + step) % n
step += 1
peo =[p for p in peo if p > 0]
for p in peo:
print(p)
1
2
3
4
5
6
7
8
9
10
11
12
10、父与子
题目背景:
学校举办亲子运动会,所有的父亲一组,孩子一组,出场规则是:父亲组先
派一个人上场之后孩子组才能派一个人上场,假设每队3个人,可能的出场策略
包括5种:
父父父子子子、父父子子父子、父父子父子子、父子父父子子、父子父子父
子
任意输入父子的对数n(3 <= n <= 15),计算并输出有多少种出场策略。
输入描述:
输入父子对数n
输出描述:
输出共有多少种出场策略
样例输入:
3
样例输出:
5
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检
查并修改
# 对于给定元组,逐个判断,对元组进行切片操作,统计父和子的个数,进行比
较
def is valid(tp):
for i in range(n * 2):
t = tp[:i + 1]
father = t.count('父')
son = t.count('子')
if father < son:
return False
1
2
3
4
5
6
7
8
-END-
return True
n = int(input())
arr = ['父'] * n + ['子'] * n
res = []
from itertools import permutations# 获取全排列,并进行过滤操作
for a in permutations(arr,n *2):
if is valid(a) and a not in res:
res.append(a)
print(len(res))
9
10
11
12
13
14
15
16
17