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

从输入数字列表提取孪生素数的Python代码错误排查求助

孪生素数提取代码错误排查与修正

需求说明

输入空格分隔的数字并存储为列表,提取其中所有孪生素数(定义为差值为2的两个素数);若列表中无孪生素数,输出No any twin primes。

原代码

lst = input()
test_list =[]

for ele in lst.split():
    n_int = int(ele)
    test_list.append(n_int)

def prime(x):
    for k in range(2, x):
        if x%k == 0:
            return False
    return True

diff = 0
for i in test_list:
    for j in test_list:
        if prime(i) and prime(j):
            diff = abs(i-j)
        if diff == 2:
            print(i, j)
        
print("No any twin primes")

问题现象

输入3 4 5 7 8时,预期输出:

3 5
5 7

实际输出:

3 5
5 3
5 4
5 7
5 9
7 5
No any twin primes

仅当输入无孪生素数的列表(如2 3 7 9)时,提示输出符合预期。

错误分析

  1. 重复输出反向对:嵌套循环会遍历所有i和j的组合,导致3 5和5 3这类反向对都被输出,不符合预期的无重复结果。
  2. diff变量未重置:diff值会保留上一次循环的结果,比如之前计算出5和3的差值为2后,后续循环中5和4的判断会复用这个diff=2,导致非素数对被错误输出。
  3. 提示信息强制输出:无论是否找到孪生素数,最后都会执行print("No any twin primes"),逻辑错误。
  4. 素数判断效率低:原素数判断循环遍历到x,未处理x<2的非素数情况,且未优化到平方根范围,效率低下。

修正后的代码

# 读取输入并转换为整数列表
test_list = list(map(int, input().split()))

def is_prime(x):
    # 处理小于2的非素数
    if x < 2:
        return False
    # 优化循环到平方根,减少计算量
    for k in range(2, int(x**0.5) + 1):
        if x % k == 0:
            return False
    return True

# 筛选列表中的素数,并存入集合(方便快速查找)和列表(保持遍历顺序)
prime_set = set()
prime_list = []
for num in test_list:
    if is_prime(num):
        prime_set.add(num)
        prime_list.append(num)

found_twin = False
# 遍历素数列表,只查找num+2存在的情况,避免反向对重复输出
for num in prime_list:
    if (num + 2) in prime_set:
        print(num, num + 2)
        found_twin = True

# 仅未找到孪生素数时输出提示
if not found_twin:
    print("No any twin primes")

修正说明

  • 优化素数判断逻辑:增加x<2的边界处理,循环遍历到x的平方根,大幅提升判断效率。
  • 用集合存储素数:利用集合O(1)的查找效率,快速判断num+2是否在素数列表中。
  • 避免重复反向对:只输出num和num+2的有序对,不会出现5 3这类反向结果。
  • 控制提示输出:通过found_twin标记变量,仅当未找到孪生素数时才输出提示信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:40:26