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

Python质数列表生成器异常:25、49未被过滤的原因排查

质数生成代码的Bug分析与修复

咱们来好好看看为啥你的代码会让25、49这类非质数混进结果里——核心是两个关键错误:

1. upper变量没有动态更新

你把upper = start - 2写在了while循环外面,这意味着它只会在程序启动时计算一次(初始值是5-2=3),之后不管start变成25、49还是其他数,upper永远都是3。

这就导致了一个致命问题:每次divisor重置为3的时候,程序会直接触发elif divisor == upper的条件(毕竟3等于3),直接把当前的start当成质数写入文件,完全跳过了后续的整除检查!比如当start=25时,divisor刚回到3,程序就判定“符合写入条件”,根本没去检查25能不能被5整除。

2. 质数判断的范围完全没必要那么大

就算修复了upper的问题,原来的start-2也完全是多余的——判断一个数是否为质数,只需要检查到这个数的平方根就够了。比如判断25是否为质数,只要检查到5(√25=5)就行,因为如果25有大于5的因数,那对应的另一个因数肯定小于5,早就被检查到了。

修复后的代码

我把这两个问题都修正了,你可以试试这段代码:

start = 5
number = 1
# 用with语句自动关闭文件,更安全
with open("hey.txt", "w") as doc:
    while number <= 17:
        is_prime = True
        # 计算当前数的平方根,取整后加1,确保覆盖所有可能的因数
        max_divisor = int(start ** 0.5) + 1
        # 只检查奇数因数,提升效率
        for divisor in range(3, max_divisor, 2):
            if start % divisor == 0:
                is_prime = False
                break
        if is_prime:
            doc.write(f"{start}, ")
            number += 1
        # 只遍历奇数,跳过偶数
        start += 2

代码说明

  • 用with语句处理文件,无需手动关闭,避免资源泄漏
  • 每次循环都重新计算max_divisor,确保只检查必要的因数,提升效率
  • 用is_prime标记清晰判断是否为质数,逻辑更易懂

运行这段代码后,生成的hey.txt里会是正确的17个从5开始的质数:5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:48