从输入数字列表提取孪生素数的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)时,提示输出符合预期。
错误分析
- 重复输出反向对:嵌套循环会遍历所有i和j的组合,导致
3 5和5 3这类反向对都被输出,不符合预期的无重复结果。 - diff变量未重置:
diff值会保留上一次循环的结果,比如之前计算出5和3的差值为2后,后续循环中5和4的判断会复用这个diff=2,导致非素数对被错误输出。 - 提示信息强制输出:无论是否找到孪生素数,最后都会执行
print("No any twin primes"),逻辑错误。 - 素数判断效率低:原素数判断循环遍历到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
相关产品推荐
相关产品推荐

