题目:求10000之内的素数
程序分析
求10000之内的素数是一个常见的问题。素数是大于1且只能被1和自身整除的整数。我们可以使用循环遍历10000以内的每个数,判断其是否是素数。
方法1: 简单遍历法
遍历2到10000之间的每个数,判断其是否为素数。从2开始,依次将当前数除以2、3、4、…、它本身的前一个数,若能被整除,则不是素数。
def is_prime(num):
if num < 2:
return False
for i in range(2, num):
if num % i == 0:
return False
return True
def find_primes_simple(limit):
primes = []
for i in range(2, limit + 1):
if is_prime(i):
primes.append(i)
return primes
# Find primes up to 10000
primes_simple = find_primes_simple(10000)
print("Prime numbers up to 10000:", primes_simple)
方法2: 优化遍历法
遍历2到10000之间的每个数时,只需判断是否能被2到sqrt(n)之间的数整除,可减少循环次数。
import math
def is_prime(num):
if num < 2:
return False
sqrt_num = int(math.sqrt(num))
for i in range(2, sqrt_num + 1):
if num % i == 0:
return False
return True
def find_primes_optimized(limit):
primes = []
for i in range(2, limit + 1):
if is_prime(i):
primes.append(i)
return primes
# Find primes up to 10000
primes_optimized = find_primes_optimized(10000)
print("Prime numbers up to 10000:", primes_optimized)
方法3: 埃拉托斯特尼筛法
利用埃拉托斯特尼筛法可以更高效地找出素数。该方法是一种筛选法,从2开始,依次排除2的倍数、3的倍数、4的倍数,直至sqrt(n)。
def sieve_of_eratosthenes(limit):
is_prime = [True] * (limit + 1)
is_prime[0] = is_prime[1] = False
p = 2
while (p * p <= limit):
if is_prime[p]:
for i in range(p * p, limit + 1, p):
is_prime[i] = False
p += 1
primes = [i for i in range(2, limit + 1) if is_prime[i]]
return primes
# Find primes up to 10000
primes_eratosthenes = sieve_of_eratosthenes(10000)
print("Prime numbers up to 10000:", primes_eratosthenes)
解题思路及优缺点
- 简单遍历法:
- 优点:
- 简单易懂,实现直接。
- 缺点:
- 效率较低,需要对每个数都进行多次除法运算。
- 优点:
- 优化遍历法:
- 优点:
- 减少了循环次数,只需判断2到sqrt(n)的数即可。
- 缺点:
- 仍然需要进行除法运算。
- 优点:
- 埃拉托斯特尼筛法:
- 优点:
- 最高效的方法,只需进行一次筛选,不需要除法运算。
- 缺点:
- 需要额外空间存储每个数是否为素数。
- 优点:
总结推荐
推荐使用埃拉托斯特尼筛法,它是最高效的方法,只需要进行一次筛选即可找出素数。虽然需要额外的空间存储素数信息,但可以大大提高计算效率,特别是在大数范围内。