编写统计给定范围素数的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
相关产品推荐
相关产品推荐

