题目:找出1-N之间的所有素数,并输出所有素数.
素数又称质数,是指只能被1和自身整除的整数,即除了1和本身以外没有其他因数的正整数。例如,2、3、5、7、11等都是素数。任何大于1的正整数都可以由素数相乘得到,因此素数具有重要的数学意义。
方法一:暴力枚举法
python
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
def find_prime(n):
prime_list = []
for i in range(2, n):
if is_prime(i):
prime_list.append(i)
return prime_list
优点:实现简单,容易理解。
缺点:时间复杂度较高,无法处理较大的素数范围。
方法二:优化枚举法
python
def find_prime(n):
prime_list = []
for i in range(2, n):
j = 2
while j <= int(i ** 0.5):
if i % j == 0:
break
j += 1
if j > int(i ** 0.5):
prime_list.append(i)
return prime_list
优点:减少了部分重复计算,时间复杂度有所降低。
缺点:仍然无法处理较大的素数范围。
方法三:埃氏筛法
python
def find_prime(n):
prime_list = []
is_prime = [True] * (n+1)
for i in range(2, n+1):
if is_prime[i]:
prime_list.append(i)
for j in range(i*i, n+1, i):
is_prime[j] = False
return prime_list
优点:时间复杂度较低,可以处理较大的素数范围。
缺点:空间复杂度较高,需要一个大小为(n+1)的数组来判断是否为素数。
方法四:欧拉筛法
python
def find_prime(n):
prime_list = []
is_prime = [True] * (n+1)
for i in range(2, n+1):
if is_prime[i]:
prime_list.append(i)
for j in range(len(prime_list)):
if i * prime_list[j] > n:
break
is_prime[i * prime_list[j]] = False
if i % prime_list[j] == 0:
break
return prime_list
优点:时间复杂度较低,空间复杂度较低。
缺点:实现较为复杂,需要对已知素数进行筛选。