统计(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
相关产品推荐
相关产品推荐

