桑达拉姆筛法未移除全部目标数,Python代码错误排查求助
桑达拉姆筛法代码错误分析与修正
核心问题
你的代码存在两个关键错误,导致结果出现非质数:
遍历动态修改的列表引发逻辑异常
你在遍历num_lst的同时调用remove()修改列表,这会导致循环跳过部分元素。当列表元素被移除后,后续元素的索引会前移,原本应该遍历到的元素会被跳过,最终有些该移除的数没被处理,残留的数转换后就变成了非质数。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
相关产品推荐
相关产品推荐

