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

编写统计给定范围素数的Python函数时出现list index out of range报错

素数统计代码报错排查及修复

索引越界报错原因

  • 你遍历的i是列表my_list的元素值,而非列表索引。my_list由range(2, num+1)生成,元素最小为2,但Python列表索引从0开始计数,当你尝试用元素值作为索引取值my_list[i]时,会直接超出列表的有效索引范围,触发list index out of range报错。比如当num=2时,my_list = [2],唯一有效索引是0,循环取到的i=2,执行my_list[2]就会直接报错。

其他逻辑问题

  • y = not x逻辑完全错误:所有大于等于2的整数布尔值为True,not x永远返回False,转数值后为0,后续r永远为0,你的素数判断条件r != 0永远不成立,无法筛选出任何素数。
  • 变量z定义在for循环内部,每次循环都会被重置为空列表,就算判断条件成立,最后返回的也只是最后一次循环的结果,统计值完全错误。
  • 原素数判断规则错误:x%1 == 0和x%x == 0是所有正整数都满足的特性,完全无法区分素数与合数。

修正后的实现代码

基础暴力判断版本

def count_primes(num):
    # 小于2的范围没有素数
    if num < 2:
        return 0
    prime_count = 0
    for x in range(2, num + 1):
        is_prime = True
        # 只需判断到x的平方根即可完成素数校验
        for i in range(2, int(x ** 0.5) + 1):
            if x % i == 0:
                is_prime = False
                break
        if is_prime:
            prime_count += 1
    return prime_count

高性能埃氏筛版本

def count_primes(num):
    if num < 2:
        return 0
    # 初始化标记数组,默认所有数都是素数
    is_prime = [True] * (num + 1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(num ** 0.5) + 1):
        if is_prime[i]:
            # 把i的所有倍数标记为非素数
            for j in range(i * i, num + 1, i):
                is_prime[j] = False
    # 统计标记为True的数量就是素数总数
    return sum(is_prime)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:48:04