为何我的埃拉托斯特尼筛法代码返回以5结尾的数字?
埃拉托斯特尼筛法代码错误排查与修正
你的代码核心问题是**return primelist的缩进位置错误**——它被放在了外层for循环的内部,导致第一次i=2的循环执行完毕后就直接返回了列表,后续i=3、5...的筛选步骤完全没有运行,自然会留下大量未被筛选的合数(比如25、35这类以5结尾的数)。
原代码错误点展示
import math def sieve (x): primelist = list(range(2,x)) for i in range (2,math.isqrt(x)): for n in range (i, x//i+1): y = n*i if y in primelist: primelist.remove(y) return primelist # 此处缩进错误,导致循环提前终止并返回
修正后的代码
将return primelist移到外层for循环的外部,确保所有筛选逻辑执行完毕后再返回结果;同时补充math.isqrt(x)的+1,避免遗漏平方根本身的筛选:
import math def sieve(x): primelist = list(range(2, x)) for i in range(2, math.isqrt(x) + 1): for n in range(i, x // i + 1): y = n * i if y in primelist: primelist.remove(y) return primelist # 移至外层循环外,确保所有筛选完成
额外效率优化提示
原代码用list.remove()的效率较低(每次查找元素是O(n)复杂度),更高效的写法是用布尔数组标记非质数:
import math def sieve(x): if x <= 2: return [] is_prime = [True] * x is_prime[0] = is_prime[1] = False for i in range(2, math.isqrt(x) + 1): if is_prime[i]: # 直接标记i的所有倍数为非质数 is_prime[i*i : x : i] = [False] * len(is_prime[i*i : x : i]) return [num for num, prime in enumerate(is_prime) if prime]
内容的提问来源于stack exchange,提问作者abinashe
相关产品推荐
相关产品推荐

