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

桑达拉姆筛法未移除全部目标数,Python代码错误排查求助

桑达拉姆筛法代码错误分析与修正

核心问题

你的代码存在两个关键错误,导致结果出现非质数:

  1. 遍历动态修改的列表引发逻辑异常
    你在遍历num_lst的同时调用remove()修改列表,这会导致循环跳过部分元素。当列表元素被移除后,后续元素的索引会前移,原本应该遍历到的元素会被跳过,最终有些该移除的数没被处理,残留的数转换后就变成了非质数。

  2. i和j的遍历范围不符合算法逻辑
    桑达拉姆筛法要求i、j是从1开始的整数,且满足i ≤ j和i+j+2ij ≤n。但你直接遍历原列表的元素作为i、j,当列表元素被移除后,i、j的取值会缺失,还会做大量无效循环(比如j取到已被移除的数,或者j的取值超出满足条件的范围)。

修正后的代码

我们先收集所有需要移除的数(用集合避免重复),再从原列表中过滤这些数,避免遍历动态列表的问题。同时严格控制i、j的遍历范围:

n = int(input())
num_lst = list(range(1, n + 1))
to_remove = set()

# 控制i的遍历范围:当i取当前值时,最小的j=i对应的结果不超过n
i = 1
while True:
    min_result = i + i + 2 * i * i
    if min_result > n:
        break
    # j从i开始,直到计算结果超过n
    j = i
    while True:
        current = i + j + 2 * i * j
        if current > n:
            break
        to_remove.add(current)
        j += 1
    i += 1

# 不用列表推导式的过滤写法
filtered_lst = []
for k in num_lst:
    if k not in to_remove:
        filtered_lst.append(k)

# 转换为质数,不用列表推导式的写法
primes = []
for k in filtered_lst:
    primes.append(2 * k + 1)

# 桑达拉姆筛法默认不生成2,若n≥2需手动添加唯一偶质数2
if n >= 2:
    primes.insert(0, 2)

print(primes)

测试验证

输入50时,修正后的代码输出为:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97],所有数均为质数,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:37:17