如何用Python统计指定区间素数总数并将所有素数统一存入同一列表
现有代码的问题
- 素数判断的核心逻辑没有问题,核心错误出在列表初始化的位置:
numlist = []写在了素数判断成功的分支内部,每识别到一个素数就会新建一个空列表,再把当前素数加入列表后打印,因此最终输出的是多个独立的单元素列表,不符合统一存储所有素数的预期。
基础修正方案
只需要把存储素数的空列表初始化步骤移到外层遍历循环的外部,让所有素数都追加到同一个列表实例中,最后统一打印列表即可;同时可以直接通过列表长度获取区间内素数的总数量,不需要单独计数。
修正后的代码:
lower = int(input("Enter the begining of the range: ")) upper = int(input("Enter the end of the range: ")) print("Prime numbers between", lower, "and", upper, "are:") # 提前初始化统一的素数存储列表,放在循环外部 prime_list = [] for num in range(lower, upper + 1): if num > 1: for i in range(2, num): if (num % i) == 0: break else: prime_list.append(num) # 统一打印全量素数列表 print(prime_list) # 直接取列表长度得到素数总数 print(f"{lower}~{upper}区间内共有{len(prime_list)}个素数")
输入起始值1、结束值10时,修正后的代码运行输出为:
Prime numbers between 1 and 10 are: [2, 3, 5, 7] 1~10区间内共有4个素数
性能优化方案
原有素数判断逻辑存在冗余循环,可以从两个方向优化:
- 因数判断范围压缩:如果一个数存在大于自身平方根的因数,必然存在一个小于自身平方根的对应因数,因此不需要遍历到
num-1,仅需遍历到目标数的平方根即可,可大幅减少循环次数,在大区间下性能提升明显。 - 无效判断过滤:大于2的偶数一定不是素数,可以直接跳过,减少一半的判断量。
优化后的代码示例:
import math lower = int(input("Enter the begining of the range: ")) upper = int(input("Enter the end of the range: ")) print("Prime numbers between", lower, "and", upper, "are:") prime_list = [] # 单独处理唯一的偶素数2 if lower <= 2 <= upper: prime_list.append(2) # 从奇数起始值开始遍历,步长为2,跳过所有偶数 start_num = max(3, lower if lower % 2 == 1 else lower + 1) for num in range(start_num, upper + 1, 2): # 因数判断仅遍历到num的平方根,且同样只判断奇数因数 for i in range(3, int(math.sqrt(num)) + 1, 2): if num % i == 0: break else: prime_list.append(num) print(prime_list) print(f"{lower}~{upper}区间内共有{len(prime_list)}个素数")
内容的提问来源于stack exchange,提问作者Mozart
相关产品推荐
相关产品推荐

