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

Python用while和is_prime生成前100个素数出现死循环怎么解决

问题原因
  • 核心原因是is_prime函数的判断顺序逻辑错误:你将n%2==0的判断放在了n==2的判断之前,2作为唯一的偶素数,会被if n%2==0 or n<2: return False直接判定为非素数返回,后续的n==2判断永远不会触发。这就导致程序永远收集不到第一个素数,first_primes列表长度始终为0,外层while len(first_primes)<100的条件永远满足,进入无限循环。你手动终止程序时触发的KeyboardInterrupt正好落在程序执行占比最高的is_prime循环判断行,属于正常的终止报错,不是代码本身的语法错误。
  • 次要问题是循环嵌套逻辑冗余:外层while循环判断长度,内层又写了遍历0到100万的for循环,就算修复了is_prime的逻辑,内层for也会一次性把0到100万的所有素数都塞进列表,远超过100个的需求,完全没必要。
  • 额外优化点:is_prime里的循环遍历到n完全没必要,素数判断只需要遍历到√n即可,因为如果n有大于√n的因数,那对应的另一个因数必然小于√n,早就被检测到了。
修复方案
  1. 调整is_prime函数的判断顺序,把边界值判断提前,同时优化循环范围提升效率
  2. 去掉冗余的嵌套for循环,直接逐个递增数字判断,收集够100个素数就停止

修复后的完整代码如下:

def is_prime(n):
    if isinstance(n,int) == False:
        return False
    # 先做边界值判断
    if n < 2: 
        return False
    if n == 2 or n == 3: 
        return True
    # 再排除偶数和3的倍数
    if n%2 == 0 or n%3 == 0: 
        return False
    # 循环范围优化到平方根,步长设为2跳过偶数
    for i in range(5, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

first_primes = []
current_num = 2
while len(first_primes) < 100:
    if is_prime(current_num):
        first_primes.append(current_num)
    current_num += 1

print(first_primes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:03