You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python技术求助:判断一个数能否表示为两个半素数之和

问题分析与解决方案

你需要实现一个程序判断一个数是否能表示为两个半素数的和(半素数定义为两个素数的乘积,可相同),你的现有代码存在边界处理和范围限制的问题,下面我们一步步拆解修复:

现有代码的核心问题

  1. 循环越界风险checkSP函数的while(arr[i] <= n/2)没有判断i是否超出arr的长度,当输入的n过大(比如超过两个最大预生成半素数的和),会直接抛出IndexError
  2. 固定MAX的限制:预生成的半素数范围被固定为小于200,无法处理大于388(两个最大小于200的半素数之和)的输入。
  3. 边界情况遗漏:没有处理n < 8的情况(最小的两个半素数是4,和为8,小于8的数不可能满足条件)。

修复后的完整代码

def is_semiprime(num):
    """判断一个数是否为半素数"""
    if num < 4:
        return False
    factor_count = 0
    temp = num
    # 分解素因子,中途超过2个直接返回False
    for j in range(2, int(temp**0.5) + 1):
        while temp % j == 0:
            factor_count += 1
            temp = temp // j
            if factor_count > 2:
                return False
    # 剩余的数若大于1,说明是另一个素因子
    if temp > 1:
        factor_count += 1
    return factor_count == 2

def check_two_semiprimes_sum(n):
    """判断n是否能表示为两个半素数之和"""
    # 最小的两个半素数和为4+4=8,小于8直接返回No
    if n < 8:
        return False
    # 生成所有小于等于n的半素数,避免固定范围限制
    semiprimes = [x for x in range(4, n+1) if is_semiprime(x)]
    # 遍历到n/2即可,避免重复判断
    for sp in semiprimes:
        if sp > n // 2:
            break
        if is_semiprime(n - sp):
            return True
    return False

n = int(input())
print("Yes" if check_two_semiprimes_sum(n) else "No")

代码细节解释

  1. is_semiprime函数:单独封装半素数判断逻辑,分解素因子时如果计数超过2直接返回False,提升效率;同时处理了小于4的数(无法成为半素数)的边界。
  2. check_two_semiprimes_sum函数
    • 先处理n < 8的极端情况,直接返回False
    • 动态生成所有小于等于n的半素数,摆脱固定范围的限制;
    • 遍历半素数时,当当前半素数超过n/2就停止,避免重复判断(比如4+5858+4是同一种情况)。
  3. 测试验证
    • 输入3015+15=30,两个都是半素数,返回Yes,符合预期;
    • 输入624+58=62,两个都是半素数,返回Yes(你提供的示例2可能存在错误,实际62是可以表示为两个半素数之和的)。

内容的提问来源于stack exchange,提问作者Samurai

火山引擎 最新活动