优草派  >   Python

python求1到100的素数

王志强            来源:优草派

素数是指只能被1和自身整除的正整数,如2、3、5、7、11等。对于算法学习者来说,求素数是一个基本的练手题目。本文将以Python语言为例,介绍几种求1到100的素数的算法。

算法一:暴力枚举法

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),相比埃氏筛法进一步降低了时间复杂度,是求素数的高效算法。

除了以上三种算法外,还有其他求素数的算法,如欧拉筛法、米勒-拉宾算法等。不同的算法在不同的场景下有不同的适用性,可以根据实际情况选择最优算法。

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行