素数是指只能被1和自身整除的正整数,如2、3、5、7、11等。对于算法学习者来说,求素数是一个基本的练手题目。本文将以Python语言为例,介绍几种求1到100的素数的算法。
算法一:暴力枚举法
暴力枚举法是最基本的求素数算法,其思路是对于每个待判断的数,遍历2到它本身减1的所有数,若存在能够整除的数,则该数不是素数。Python代码如下:
```python
for i in range(2, 101):
flag = True
for j in range(2, i):
if i % j == 0:
flag = False
break
if flag:
print(i, end=' ')
```
该算法的时间复杂度为O(n^2),当n较大时,运行时间会非常长。因此,这种算法一般只用于小数据量的情况。
算法二:埃氏筛法
埃氏筛法是一种基于质数的筛法,其思路是从2开始,将每个质数的倍数都标记成合数,直到筛完所有小于等于n的数。Python代码如下:
```python
n = 100
prime = [True] * (n+1)
for i in range(2, int(n**0.5)+1):
if prime[i]:
for j in range(i*i, n+1, i):
prime[j] = False
for i in range(2, n+1):
if prime[i]:
print(i, end=' ')
```
该算法的时间复杂度为O(nloglogn),相比暴力枚举法大大降低了时间复杂度,适用于大数据量的情况。
算法三:线性筛法
线性筛法是一种改进的埃氏筛法,其主要思想是用已知的质数去筛后面的数,而不是用后面的数去筛已知的质数。Python代码如下:
```python
n = 100
prime = []
isprime = [True] * (n+1)
for i in range(2, n+1):
if isprime[i]:
prime.append(i)
for j in range(len(prime)):
if i*prime[j] > n:
break
isprime[i*prime[j]] = False
if i % prime[j] == 0:
break
for i in prime:
print(i, end=' ')
```
该算法的时间复杂度为O(n),相比埃氏筛法进一步降低了时间复杂度,是求素数的高效算法。
除了以上三种算法外,还有其他求素数的算法,如欧拉筛法、米勒-拉宾算法等。不同的算法在不同的场景下有不同的适用性,可以根据实际情况选择最优算法。