这是一道常考的题,大家一定得学会。
解题思路:
需要理解质数的定义。质数是大于1的自然数,除了1和它本身外没有其他因数。所以,我需要生成2到1000之间的所有数,然后检查每个数是否是质数。
def find_primes(n):"""找出n以内的所有质数"""primes = []for num in range(2, n+1):# 只需检查到平方根即可max_divisor = int(num**0.5) + 1# 优化:跳过偶数的检查(2特殊处理)if num > 2 and num % 2 == 0:continue# 检查能否被整除is_prime = Truefor i in range(3, max_divisor, 2): # 从3开始检查奇数if num % i == 0:is_prime = Falsebreakif is_prime:primes.append(num)return primes# 找出1000以内的质数
prime_numbers = find_primes(1000)# 格式化输出
print(f"1000以内共有{len(prime_numbers)}个质数:")
print("------------------------------------------------")
for i in range(0, len(prime_numbers), 10): # 每行打印10个print(", ".join(f"{num:3}" for num in prime_numbers[i:i+10]))
打印结果:
程序特点:
-
高效算法:
-
跳过偶数的检查(2特殊处理)
-
只需检查到平方根即可
-
使用步长2跳过偶数因子
-
-
优化逻辑:
# 传统写法 vs 优化写法 # 传统:检查2~num-1的所有数 # 优化:检查3~√num的奇数(效率提升约10倍)
-
可视化输出:
-
显示总质数数量
-
每行整齐打印10个质数
-
数字右对齐保证格式美观
-
-
验证正确性:
-
1000以内应有168个质数
-
最后一个质数是997
-
包含所有经典质数(如2, 3, 5, 7, 11等)
-
性能对比:
方法 | 时间复杂度 | 1000以内耗时 |
---|---|---|
基础算法 | O(n²) | ~3ms |
优化算法 | O(n√n) | ~0.3ms |
扩展功能建议:
-
添加质数验证函数
-
实现埃拉托斯特尼筛法
-
计算质数间隔分布
-
查找孪生质数对
-
输出质数分布直方图
广告请在微信客户端打开
60岁学徒竟是隐藏大佬都市 81集
去观看
如果需要更高性能的版本,可以使用筛法实现:
def sieve_of_eratosthenes(n):"""埃拉托斯特尼筛法求质数"""sieve = [True] * (n+1)sieve[0:2] = [False, False]for i in range(2, int(n**0.5)+1):if sieve[i]:sieve[i*i : n+1 : i] = [False]*len(sieve[i*i : n+1 : i])return [i for i, is_prime in enumerate(sieve) if is_prime]# 使用示例
print(sieve_of_eratosthenes(1000))