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

为何我的埃拉托斯特尼筛法代码返回以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:15:41