第8届Python编程挑战赛复赛真题剖析-2022年全国青少年信息素养大赛

 [导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛系列的第2讲。

全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。 

大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。

大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。

一.赛事说明

2021-2022年(第8届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。

本届Python挑战赛是在线上举行,参赛选手登录大赛官网在指定页面完成答题并提交答案。评定成绩的依据是同时考虑得分和用时两个方面,首先是得分高者名次靠前,如果得分一样,则用时少者名次靠前。

2021-2022年全国青少年Python编程挑战赛复赛阶段的比赛是在7月24日举行的。一共六道题,全是编程题,考试时间是60分钟。

6道编程题分别是分草莓、计算购买铅笔金额、判断位数、打印星号、缺憾数和报数游戏,接下来超平老师为大家一一解析。

二.真题解析

第1题

小明邀请了四个同学一起游玩,带了一盒草莓平均分给大家一起吃,任意输入草莓的数量n,输出每个人可以分到几颗草莓,最后剩下了几颗。

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改

输入样例:

28

输出样例::

5

3

[超平老师解读]:

本题考查的知识点是求商和余数。

需要注意的是,小明邀请了4个同学,加上自己,一共是5个人。解题步骤比较简单,首先需要将输入的数字字符n,转成整数n,然后求n除以5的商和余数。

在Python中,整除运算符是//,求余数运算符是%。当然,如果你知道内置函数divmod,也可以直接使用该函数直接得到商和余数。

[参考代码]:

# 将字符数字转成整数
n = int(input())
# 方法1,使用 //和 %运算符
print(n // 5)
print(n % 5)
# 方法2,使用divmod内置函数
a, b = divmod(n,5)
print(a)
print(b)

第2题

商店铅笔优惠销售标准:购买8支以内(含),每支售价0.8元,超过8支部分,每支售价0.7元。任意输入购买的铅笔总量n,输出总金额。

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改

输入样例:

11

输出样例:

8.5

[超平老师解读]:

本题考查的知识点包括双分支条件结构和算术运算。

对于输入的铅笔数量n,需要进行判断,分如下两种情况:

  • n <= 8时,直接计算,金额 = n * 0.8;

  • n > 8时,先计算8支铅笔的金额,再加上超过8支的部分,金额 = 8 * 0.8 + (n - 8)* 0.7;

[参考代码]:

# 将字符数字转成整数
n = int(input())
# 分两种情况进行计算
if n <= 8:
    print(n * 0.8)
else:
    print( 8 * 0.8 + (n - 8) * 0.7 )

在Python编程中,if...else语句可以直接写在一行,如此一来,代码可以简化如下:

# 将字符数字转成整数
n = int(input())
# 一行代码的写法
print(n * 0.8 if n <= 8 else 8 * 0.8 + (n - 8) * 0.7)

第3题

输入一个正整数n,如果是四位数,则分别输出这个数千位、百位,十位和个位分别为多少,如果是两位数,则输出个位数字是多少,如果不是两位或者四位数,则输出no。

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交,说明答题存在错误,可及时进行检查并修改

输入样例1:

2345

输出样例:

2

3

4

5

输入样例2:

23

输出样例:

3

输入样例3:

666

输出样例:

no

[超平老师解读]:

本题考查的知识点包括多分支选择结构和字符串运算。

在Python中,字符串类似于列表,可以直接使用下标来获取每一个字符。因此,对于输入的n,直接进行字符串运算,不用转成整数。

首先,通过len函数获取数字的长度,再根据长度进行处理,如果长度为2,则输出n[-1],如果长度为4,则分别输出n[0]、n[1]、n[2]和n[3],否则就输出”no“。

[参考代码]:

n = input()
if len(n) == 2:
    print(n[-1])
elif len(n) == 4:
    print(n[0],n[1],n[2],n[3],sep="\n")
else:
    print("no")

在Python编程中,print函数可以输出多个内容,默认使用空格隔开,如果要使用其它符号,可以通过关键字参数sep来设置,"\n"是转义字符,表示换行。

对于列表和字符串,在Python中,还有一个强大的解包运算,使用*即可,所以上面的第5行代码,也可以直接简化如下:

print(*n,sep="\n")

解包,也叫拆包,你可以这样理解,一个列表或字符串是一个整体,想把列表或字符串中每个元素或字符当成一个独立个体剥离出来,这个过程就是解包。


第4题

任意输入一个整数n,输出一个n行的的图案,每行都是由数字+空格+*号组成,*号后无空格。

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改

输入样例:

5

输出样例:

0*********

1 *******

2  *****

3   ***

4    *

[超平老师解读]:

本题考查的知识点包括循环语句和print函数。

根据题目的描述,每一行由3个部分构成:

  • 数字,从0开始,接下来依次是1、2、3...;

  • 空格,其数量和数字一一对应,第1行0个,第2行1个,以此类推;

  • 星号*,是一个奇数系列,最后一行是1个,从下到上,依次是1、3、5、7、9,奇数的规律一般可以用数学公式描述为 2 * n +/- 1。由于这里的星号是倒金字塔结构,  如果使用i表示循环计数器,那么公式中的 n 应该为 n - i,如此一来,每一行对应的*数量就是 2 * (n - i) - 1;

在使用print函数的时候,可以通过*运算一次性输出多个字符串,例如print("*" * 10)就意味着输出10个*。

[参考代码]:

n = int(input())
for i in range(n):
    print(i," " * i, "*" * (2 * (n - i) - 1), sep="")

当然了,如果你不知道或者不想使用print("*" * 10)这种方式,也可以使用循环分别输出数字、空格和*。​​​​​​​

for i in range(n):
    # 输出数字
    print(i,end="")
    # 输出空格
    for j in range(i):
        print(" ",end="")
    # 输出*
    for j in range(0,2 * (n - i) - 1):
        print("*",end="")
    # 换行
    print()

第5题

已知:缺憾数是指这个数加1之后一定可以表示成另一个数的平方的形式,比如8和99就是两个缺憾数:

8 + 1 = 3 ^ 2

99 + 1 = 10 ^ 2

任意输入两个正整数m和n,按顺序输出m和n这两个数字范围内所有的缺憾数。

注意:

input()内不添加任何参数

输入样例:

48

10

输出样例:

15

24

35

[超平老师解读]:

本题考查的知识点包括枚举算法和平方数。

第一步,我们需要对m和n之间所有的数字进行判断,这就是典型的枚举算法。在这一步中,要注意两个问题,一是m和n是任意输入的,需要确定二者的大小关系,可以使用min和max函数;二是要考虑是否包含m和n,根据题目给出的测试数据,应该是不包含m和n的。

第二步,针对每一个数字,需要判断是否为平方数,最简单的思路就是对该数字进行开方运算,然后取整再进行平方运算,如果二者相等,则说明是平方数。

在Python中,要进行开平方运算,有如下3种方式:

  • 直接使用乘方运算,即 n ** 0.5;

  • 使用内置的pow函数,即pow(n, 0.5);

  • 使用math库中的sqrt函数;

相对来说,使用第一种方式最为简单。

[参考代码]:

m = int(input())
n = int(input())

for i in range(min(m,n), max(m,n)):
    # 计算开方数,并转成整数
    a = (i + 1) ** 0.5
    # 将a转成整数
    a  = int(a)
    if i + 1 == a ** 2:
        # 输出数字
        print(i)

如果不熟悉**运算的话,可以使用循环逐个来判断,相对来说,代码会麻烦一些。


第6题

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

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改

输入样例:

10

输出样例:

1

6

7

10

[超平老师解读]:

本题考查的知识点包括列表和枚举算法。

对于n名同学,我们需要使用列表来表示他们的方向,由于每次都是后转,这就意味着只有两种方向,可以使用-1和1来表示。

比如,先将列表的初始值都设为-1,表示向前,再进行3次循环枚举,将对应的列表项乘以-1即可。之所以使用-1和1,是因为这样运算起来更为简单。

[参考代码]:​​​​​​​

# 获取输入,并转成整数
n = int(input())
# 初始化列表,默认都是-1,表示向前
direction = [-1] * n
# 第1遍报数,注意报数是从1开始的
for i in range(n):
    if (i + 1) % 2 == 0:
        direction[i]  = 1
# 第2遍报数
for i in range(n):
    if (i + 1) % 3 == 0:
        direction[i] *= -1
# 第3遍报数
for i in range(n):
    if (i + 1) % 5 == 0:
        direction[i] *= -1

# 输出值为-1是列表项
for i in range(n):
    if direction[i] == -1:
        print(i + 1)

三.总结与思考

本次复赛一共6道编程题,题目由易到难,考查的知识点主要包括如下几个方面:

  • 循环结构,主要是for循环的运用;

  • 选择结构,包括单分支、双分支和多分支;

  • 字符串和列表的操作;

  • 运算符的使用,重点包括//、%、*、**;

  • print函数的灵活使用;

  • 枚举算法;

总体来说,题目难度不大,尤其是前3题,都是一些基本的运算、顺序结构和选择结构。

后面的3道题难度逐渐有所增加, 重点是对于循环的理解和使用。并且和数学紧密结合在一起,比如第4题中的*数量的计算,第5题中如何判断是否为平方数,第6题中1和-1之间的转换,和数学都是息息相关的。

所以说,学习少儿编程和数学是相辅相成的,编程离不开数学,有了良好的数学基础,编程会变得更简单,更高效。反之,在学习编程时,运用了大量的数学知识,不但巩固了数学知识,同时还让孩子们体会到数学的魅力和强大,从而激发了学习数学的热情。

当然,每一道题都有多种解法,也请你多思考一下,有没有更好的思路和方法,欢迎和超平老师进行交流。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香

查看更多教程,可以移步至“超平的编程课”gzh。

你可能感兴趣的:(python,少儿编程竞赛,全国青少年信息素养大赛)