全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。
大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。
大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。
一.赛事说明
2021-2022年(第8届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。2021-2022年全国青少年Python编程挑战全国总决赛于2022年8月27日正式举行。一共是10道编程题,每道题100分,满分1000分,考试时间是120分钟。
10道编程题分别如下:
- 分苹果
- 韩信点兵
- 借书
- 四位数密码
- 有票面值
- 取球
- 统计连续字符
- n的n次方
- 海盗搜身
- 父与子
超平老师将分10讲对每道题进行详细的解读和剖析,今天要解读的是第一题,分苹果。
二.题目描述
题目背景:
把一堆苹果分给n个小朋友,每个人拿到的苹果数量不同,并且每个人至少有一个。
任意输入小朋友的数量n,问这堆苹果至少应该有多少个。
输入描述:
任意输入小朋友的数量n
输出描述:
输出这堆苹果至少应该有多少个
样例输入:
3
样例输出:
6
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改
三.思路分析
分苹果问题是小学数学中常见的一类问题,几乎每个孩子都见过这类数学题。
本题的关键在于对“至少”二字的理解,我们就按照最少的情况来分析。
如果将n个人分别编号为1、2、……n,由于每个人至少有1个苹果,我们可以假设第一人分1个苹果,要保证每个人的苹果数量不同,所以接下来的每个人的苹果数量都在前1个人的基础上加1,这就意味着,对于编号为n的人来说,其苹果数量为n。
因此,问题就转化为对于输入的数字n,求1 + 2 + 3 + … + n 的和。
这是一个典型的求和问题,可以使用变量结合循环来实现,也可以使用列表来实现,接下来,我们进入具体的编程实现环节。
四.编程实现
根据上面的思路分析,我们可以使用如下两种方法来实现:
- 变量法
- 列表法
1.变量法
所谓变量法,就是从设置一个变量s,表示总和,也就是总的苹果数量。然后从1开始,循环n次,将每一次的值进行累加即可,对应的代码如下:
# 方法1,变量法
n = int(input())
s = 0
for i in range(1, n + 1):
s += i
print(s)
需要说明两点:
1). 从控制台输入的数字是字符串,需要先转成整数;
2). range函数的特点是虎头蛇尾,即包含头不包含尾,所以两个参数分别是1和n+1;
2.列表法
使用列表法的思想,就是将每个人分得的苹果数依次存入列表,然后对列表求和即可,对应的代码如下:
# 方法2,列表法
n = int(input())
fruits = []
for i in range(1, n + 1):
fruits.append(i)
print(sum(fruits))
上述代码段中的第3、4、5行,可以使用列表推导式简化如下:
fruits = [i for i in range(1, n + 1) ]
所谓列表推导式,它是Python编程中一种特殊的表达式。
它的作用是将一种数据结构作为输入,再经过过滤计算等处理,最后输出另一种数据结构。
列表推导式的语法格式如下:
listname = [expression for variable in iterable(if condition)]
各部分简单说明如下:
- listname:新生成的列表名字;
- expression:可以是一个函数调用,或者其他任何合法的可返回一个值的表达式;
- variable:变量名,代表 iterable 中的每个对象或值;
- iterable:可以是一个列表或其他任何每次访问就返回一个元素的对象;
- if condition:用于从对象中选择符合要求的列表。
有了列表推导式,可以极大地简化我们的代码。
五.总结与思考
本题比较简单,考查的知识点主要包括:
- 输入和输出语句;
- 类型转换;
- 循环结构,主要是for…in语句;
- range函数的使用和细节;
- 变量的初始化和运算;
作为国赛的第1题,没有复杂的逻辑,基本上是送分题,考查的也都是一些基础知识。
当然了,这里的关键是要读懂题意,把题目描述的场景转换为我们熟悉的题型,然后再编程实现。
还有一点,就是平时我们在编程的时候,要多进行一题多解的练习。
首先是最基础的解法,然后再尝试一些其它的方法,这样不仅可以巩固所学知识点,做到灵活运用,同时还可以让思维变得更活跃。当你想到一种巧妙的方法并顺利解决了问题,你就能体会到什么是学习的快乐了。