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

Python质数生成器问题:代码无法生成1-20间质数求解析

你的质数代码问题排查与修正

让我来帮你梳理这段代码的问题,你的核心思路是对的——从4开始逐个检查是否为质数,能被更小的数整除就跳过,否则加入质数列表,但几个细节处理不当导致结果出错:

问题分析

  • 静态的N和M导致判断失效:你在循环外只初始化了一次N和M,当时p=4,所以N = [2,3]、M = [1,2,3]。但后续p增加到5、6、7...时,N和M完全没更新,还是最初的列表。比如当p=8时,用n=2判断,8/2=4,但M里最大是3,4不在其中,代码就会错误地把8当成质数加入列表。
  • 整除判断的方式有误:用p / n in M来判断整除是个隐形坑——Python中/返回的是浮点数,比如9/3=3.0,而M里的元素是整数3,浮点数和整数在列表中是不相等的,这会导致代码误判9为质数。正确的整除判断应该用取模运算p % n == 0,结果为True就说明能被整除。
  • break逻辑混乱:原代码中当p==20时的break只能跳出内层的for循环,无法终止外层的while循环,虽然这里p到20就停,但逻辑上不够严谨。

修正后的代码

先按你的原始思路调整,保证逻辑清晰且结果正确:

P = [2, 3]
p = 4
while p < 20:
    is_prime = True
    # 每次循环都遍历2到p-1的数,检查是否能整除
    for n in range(2, p):
        if p % n == 0:
            is_prime = False
            break
    if is_prime:
        P.append(p)
    p += 1
print(P)

运行这段代码会输出正确的1-20之间的质数:[2, 3, 5, 7, 11, 13, 17, 19]

额外优化(可选)

判断质数时其实不需要遍历到p-1,只需要遍历到√p就足够了——如果p有一个大于√p的因数,那必然对应一个小于√p的因数,这样能减少循环次数,提升效率:

import math
P = [2, 3]
p = 4
while p < 20:
    is_prime = True
    # 只检查到p的平方根,向上取整
    for n in range(2, int(math.sqrt(p)) + 1):
        if p % n == 0:
            is_prime = False
            break
    if is_prime:
        P.append(p)
    p += 1
print(P)

这段优化后的代码结果和之前一致,但循环次数更少,适合处理更大范围的质数判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:57