蓝桥杯2022国赛|选素数 Python

本文解析了一个关于质数判断和质因数分解问题的算法,通过递归实现和策略优化,寻找满足特定条件的最小起始数字。关键在于选择合适质数进行操作以确保起始数最小化。

在这里插入图片描述

这个题主要考察质因数分解质数判断,构建出合理的、高效的算法还是需要动脑子的。
带有详细注释的代码如下,我相信仔细耐心阅读,便能成功理解。
下面叙述假设: a0 -> a1 -> a2(依次进行第一次操作、第二次操作)

import math
import time

#判断是否为素数
def is_prime(x):
    upper_bound = int(math.sqrt(x)) + 1
    for i in range(2, upper_bound):
        if x % i == 0:
            return False
    return True
#对指定数进行质因数分解,递归实现。
def fact(n, primes):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            primes.append(i)
            fact(n // i, primes)
            return
    primes.append(n)


n = int(input())

#如果输入数为质数,那么打印-1。因为我们的n应该是质数的倍数,
#且必须至少为2倍(题目中说了选择一个小于 x的素数p,所以至少是2倍)。  ------①
if is_prime(n):
    print(-1)
else:
    primes = []
    fact(n, primes)   #对其质因数分解

    prime_set = set(primes)  #将质因数转为集合(无重复元素)

    min_start = 1000001

    for prime in prime_set:  #遍历质因数集合
        last_left_Bound = n - prime  #假设第二次操作选择的是prime作为质数,那么第二次操作前的数(a1)不会小于n-prime。
        # print(last_left_Bound)
        #上次操作前的数字(a1)必然在左边界加1和n之间。(为什么是n?因为n可能本身就是某
        #个质数的倍数,然后这次操作又选了该质数,则n不变)
        for last_num in range(last_left_Bound + 1, n + 1):#对第一次操作后可能的数组遍历
            if is_prime(last_num):  #和①同理,不可能是质数。
                continue
            prime_tmp = []
            fact(last_num, prime_tmp)	#继续对上个数进行质因数分解
            max_gap = max(prime_tmp)    #找出最大的质因数作为第一次操作选择的质数,
                                        #这样能使起始数字尽可能小
            min_start = min(last_num - max_gap + 1, min_start) #更新维护最小数字

    if min_start == 1000001:
      print(-1)
    else:
      print(min_start)

比较关键的地方在于,我们在第二个内层循环分析时,要用第一次操作后可能得到的数字a1减去其最大的质因数,即第一次操作我们选择的质数是a1的最大质因数,这样才能让a0尽可能小。

### 蓝桥杯 Python 备考指南 #### 备考资料汇总 为了有效备战蓝桥杯Python,建议收集并深入研究一系列高质量的学习材料。入门阶段可以从零基础学习Scratch3.0的免费视频教程入手[^1],这套共114节课的内容能够帮助建立初步逻辑思维能力和编程概念理解。 对于更进一步的准备,则应重点关注历届蓝桥杯scratch以及Python组别的真题解析文档和视频讲解[^2]。这些资源不仅涵盖了过往比中的实际问题及其解决方案,还提供了详细的解题过程和技术要点说明,有助于考生熟悉考试模式与常见考点。 此外,《小兔子老师scratch编程系列课程》也是一份不可多得的教学素材集合,在此之外还有专门针对Python设计的练习册目可供参考[^3]。 #### 比题目特点 从往年的试题来看,蓝桥杯Python注重考察参者的算法基础知识应用能力、数据结构理解和程序设计技巧。例如,在一届比中曾出现过关于质数检测的问题,该类题目通常要求手具备一定的数学背景知识,并能灵活运用条件语句和循环控制来解决问题[^4]。 另一道具有代表性的题目涉及统计字符串中字符频率的任务,这类问题考验的是学生对字典这一重要容器类型的掌握程度,包括如何创建字典、向其添加键值对、查询指定key对应的value等基本操作;同时也检验了for循环迭代机制的理解情况[^5]。 ```python def count_char_frequency(s): freq_dict = {} for char in s: if char not in freq_dict: freq_dict[char] = 1 else: freq_dict[char] += 1 return freq_dict ``` #### 解题技巧分享 面对复杂的编程挑战时,保持清晰的头脑至关重要。首先要仔细阅读题目描述,确保完全明白所求为何物之后再着手编写代码。其次是要善于归纳总结相似类型习题的特点规律,提炼出通用解决框架以便快速响应新情境下的变化需求。最后一点就是不断积累实战经验,通过反复模拟测试提升临场发挥水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值