You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计(2,n)范围内孪生素数的代码仅对部分N值生效的问题排查

代码问题分析

你当前的代码存在以下几处核心错误:

  • 逻辑运算符优先级判断错误:if prime_list[count] + 2 or prime_list[count] - 2 in prime_list: 等价于 if (prime_list[count] + 2) or (prime_list[count] - 2 in prime_list),只要素数大于0,prime_list[count]+2 永远为真,判断逻辑完全失效。
  • 循环变量使用错误:遍历用的变量是i,但判断时用计数变量count做索引取素数,一旦触发elif逻辑count加2,索引就会完全错位,即使没触发elif,判断逻辑也和当前遍历的素数无关。
  • 分支逻辑顺序错误:elif的判断条件被前面的if完全覆盖,永远不会触发,你设想的同时满足加减2都在列表时加2的逻辑永远不会执行。
  • 未覆盖题目特殊规则:题目要求如果n被孪生素数包裹(n-1和n+1都是素数),即使n+1超出范围也要计入统计,你的素数查找只覆盖到n,无法判断n+1是否为素数,会漏算这类情况。
  • 成员查询效率低:用列表做in查询时间复杂度是O(n),素数数量多的时候性能很差。
修复方案

我们调整逻辑为:遍历每个小于等于n的素数,只要p+2也是素数就算作一对孪生素数,这样不需要额外去重,也能自动覆盖n被包裹的特殊场景(只要把素数查找范围扩展到n+1即可)。
修复后的代码如下:

def prime_finder(limit):
    primes = []
    for possibleprime in range(2, limit + 1):
        isprime = True
        # 优化判断范围到平方根,减少循环次数
        for num in range(2, int(possibleprime ** 0.5) + 1):
            if possibleprime % num == 0:
                isprime = False
                break
        if isprime:
            primes.append(possibleprime)
    return primes

def twin_prime(n):
    if n < 2:
        return 0
    # 查找范围扩展到n+1,覆盖特殊规则的n+1素数判断
    prime_list = prime_finder(n + 1)
    # 转集合提升查询效率
    prime_set = set(prime_list)
    count = 0
    for p in prime_list:
        if p > n:
            break
        if p + 2 in prime_set:
            count += 1
    return count
效果验证
  • 示例输入n=10,返回2,和题目要求一致。
  • 输入n=6(被5和7包裹),返回2(包含(3,5)、(5,7)两对),符合特殊规则要求。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:39:01