最小质数对-第12届蓝桥杯国赛Python真题解析

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第63讲。

最小质数对,本题是2021年5月29日举办的第12届蓝桥杯青少组Python编程全国总决赛真题编程部分第4题。题目要求给定一个大于2的偶数,编程找出质数差最小的一对,并输出其差值。

先来看看题目的要求吧。

一.题目说明

提示信息:

质数:是一个大于1的自然数,且除了1和它本身外,不能被其他自然数整除的数。最小的质数是2,1不是质数。

大于2的偶数有一个特点,任意一个大于2的偶数可以由一对质数相加得到,但有的偶数不止有一对这样的质数对。

如偶数6,有一对质数相加得6,为(3,3)

如偶数14,有两对质数相加得14,分别是(3,11),(7,7)

编程实现:

给定一个大于2的偶数,在所有满足“任意一个大于2的偶数可以由两个质数相加得到”这个特点的质数对中,找出两个质数差值最小的一对,并将差值输出(差值为大数减小数的值,两个质数相等时差值为0)。

例如:偶数16,满足特点的质数对有(5,11)和(3,13),差值最小的一对是(5,11),11减5,差值为6。

输入描述:

输入一个大于2的偶数N

输出描述:

输出满足“任意一个大于2的偶数可以由两个质数相加得到”这个特点的所有质数对中,差值最小的那一对的差值

样例输入:

16

样例输出:

6

二.思路分析

这是一道简单的枚举算法题,考查的知识点主要包括循环、条件、函数和素数等。

这就是一个典型的枚举场景,将和为n的所有质数对枚举出来,比较它们的差值,找到最小的差值即可。

我们可以分两个步骤来实现:

1). 自定义函数判断素数

2). 枚举所有质数对,获取最小差值

关于素数的判断,使用的也是枚举算法,之前已经介绍过,具体可以参考《包含3的数字-第10届蓝桥杯省赛Python真题精选》这篇教程。

对于数字n而言,假设其中一个加数为i,则另外一个加数为 n - i。

很显然,这两个加数,一个位于 n // 2的左边,一个位于n // 2的右边,最极端的情况是重叠。

因此,我们在枚举的时候,只需要将范围限定在[2, n // 2]之间就可以了,这样可以减少循环的次数,提升效率。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们分两步来编写程序:

  • 定义函数判断素数

  • 枚举所有质数对,获取最小差值

1. 定义函数判断素数

这是一段经典的代码,直接编写代码如下:

图片

代码非常简单,强调两点:

1). 为了确保完整性,对于n < 2的数字,都返回False,即不是素数;

2). 在获取n的算术平方根时,除了可以使用sqrt()函数外,直接使用**0.5 是最简洁的写法。

2. 枚举所有质数对,获取最小差值

根据前面的思路分析,编写代码如下:

图片

代码不多,说明4点:

1). 在获取最值时,通常需要定义最值的初始值,在Python编程中,可以使用正无穷大float('inf')表示最大值,相应的使用负无穷大float('-inf')表示最小值;

2). 在使用range()函数时,第二个参数要设置为 n // 2 + 1;

3). 在获取较小值时,直接使用了min()函数,方便快捷,也可以使用if语句来比较;

4). 第9行代码中,一个质数是n - i,一个是i,其差为 n - i - i,也就是n - 2 * i了。

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果啦。

四.总结与思考

本题代码在13行左右,涉及到的知识点包括:

  • 循环语句;

  • 条件语句;

  • 自定义函数;

  • 枚举算法;

作为本次国赛的第4题,本题难度一般。关键点有两个,一是熟悉素数的判断,二是如何优化代码结构,让代码变得更加简单,更加高效。

尤其是第二点,良好的代码结构可以让复杂问题变得简单,也可以减少出错的概率,那什么才算是好的代码结构呢?

一般来说,凡是具有独立功能或者重复使用的地方,就可以运用函数的编程思想,将其独立出来,自定义成一个函数。

在学习编程的时候,我们应该秉持”Write less,do more“的思想,用尽量少的代码,实现更多的功能和效果。

超平老师给你留一道思考题,本题中设置min_diff时使用了float('inf'),为什么要设置为最大值?如果不使用float('inf'),还可以设置为多少,为什么?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

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

需要源码的,可以移步至”超平的编程课“gzh。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第十三届蓝桥杯青少组python是一个关于电梯的问目要求我们模拟一个电梯系统,根据乘客的请求,确定电梯的运行状态和楼层,最终输出总运行时间。 首先,我先定义了一个电梯类,其中包括电梯的当前楼层、运行状态、总运行时间等属性,并且编写了相应的初始化函数进行初始设置。 然后,我利用一个列表来表示乘客的请求列表,列表中每个元素都是一个元组,包括请求的楼层和请求时间。通过遍历这个列表,我判断当前请求是否在电梯运行的楼层范围内。如果是,则不需要改变电梯的运行状态,只需要更新电梯的总运行时间。如果不是,则根据请求的楼层和电梯当前的楼层确定运行的方向,并且更新电梯的总运行时间。 最后,我输出了电梯的总运行时间。 这道的难点在于正确判断电梯的运行状态和方向,并且根据不同情况进行相应的操作。我通过分析目要求和思考,设计了合理的算法和逻辑,最终成功解决了问。 通过这道,我巩固了对Python语言的掌握,并且提高了编程和逻辑思维能力。这个比对于提高编程水平和培养创新能力来说是非常有益的,我会继续参加类似的比,不断提升自己。 ### 回答2: 第十三届蓝桥杯青少组Python主要包括以下几个问: 1. 判断一个数是否为素数。 在这个问中,可以使用一个循环从2开始到该数的平方根,判断是否存在能够整除该数的因子。如果不存在,则该数为素数。 2. 模拟游戏角色的移动。 这个问可以通过设定一个坐标系,然后记录游戏角色的位置和移动方向。根据给定的指令,改变角色的位置。可以使用单个变量来表示角色的位置,并根据不同的指令来更新角色的位置。 3. 求解整数序列的最大连续和。 在这个问中,可以使用动态规划的思想来解决,设置一个变量max_sum表示当前的最大连续和,另一个变量tmp_sum表示当前子序列的和。遍历整个序列,如果tmp_sum加上当前元素大于0,则更新tmp_sum,并比较tmp_sum和max_sum的大小。 4. 判断一个IP地址是否合法。 IP地址由四个整数组成,每个整数范围在0-255之间,且由点分隔。可以使用正则表达式来匹配IP地址的格式,并使用条件判断来判断每个整数是否在正确的范围内。 以上是对第十三届蓝桥杯青少组Python的简要回答。具体的解过程需要根据每个具体问的要求和限制条件来进行分析和解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值