素數(shù)是指只能被1和本身整除的正整數(shù),比如2、3、5、7、11、13等 。求100以內的素數(shù)是一個經(jīng)典的問題,也是程序員入門時常見的練手題 。下面我們將從多個角度分析如何用python求100以內的素數(shù) 。
方法一:暴力枚舉

最直接的想法是對每個數(shù)進行判斷,看它是否能被1和本身以外的數(shù)整除 。代碼如下:
```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)
```
這種方法的時間復雜度為O(n^2),對于100以內的數(shù)來說還比較快 。但如果我們要求更大范圍內的素數(shù),這種方法就變得相當?shù)托Я?。
方法二:埃氏篩法
埃氏篩法是一種經(jīng)典的素數(shù)篩法,可以在O(nloglogn)的時間復雜度內求出n以內的素數(shù) 。其基本思想是:從2開始,將每個質數(shù)的倍數(shù)都標記成合數(shù),直到篩完所有小于等于n的數(shù) 。代碼如下:
```python
def eratosthenes(n):
prime = [True] * (n + 1)
prime[0] = prime[1] = False
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
return [i for i in range(n + 1) if prime[i]]
```
這段代碼首先生成一個長度為n+1的布爾數(shù)組prime,其中prime[i]表示i是否為素數(shù) 。然后從2開始,找到第一個素數(shù)p,將p的所有倍數(shù)都標記成合數(shù),即prime[p*p], prime[p*p+p], prime[p*p+2p], ...都設為False 。接著找下一個素數(shù),重復上述操作,直到篩完所有小于等于n的數(shù) 。最后返回所有為素數(shù)的數(shù) 。
方法三:歐拉篩法
歐拉篩法是一種優(yōu)化的素數(shù)篩法,可以在O(n)的時間復雜度內求出n以內的素數(shù) 。其基本思想是:對每個數(shù)只篩掉它最小的質因子,避免重復標記 。代碼如下:
```python
def euler(n):
prime = []
vis = [False] * (n + 1)
for i in range(2, n + 1):
if not vis[i]:
prime.append(i)
for j in range(len(prime)):
t = i * prime[j]
if t > n:
break
vis[t] = True
if i % prime[j] == 0:
break
return prime
```
這段代碼首先生成一個空列表prime和一個長度為n+1的布爾數(shù)組vis,其中vis[i]表示i是否被篩掉了 。接著從2開始遍歷每個數(shù),如果它沒有被篩掉,說明它是素數(shù),將其加入prime列表中 。然后遍歷prime列表中的每個質數(shù),將當前數(shù)與質數(shù)的乘積標記成合數(shù),同時判斷如果當前數(shù)能被質數(shù)整除,就可以停止遍歷質數(shù)列表了 。
方法四:numpy優(yōu)化
numpy是python中常用的數(shù)值計算庫,它的數(shù)組操作比python原生的列表更快 。我們可以用numpy數(shù)組來實現(xiàn)埃氏篩法,從而進一步提高效率 。代碼如下:
```python
import numpy as np
def eratosthenes_np(n):
prime = np.ones(n + 1, dtype=bool)
【如何用python求100以內的素數(shù)?】prime[0] = prime[1] = False
for i in range(2, int(n ** 0.5) + 1):
if prime[i]:
prime[i * i: n + 1: i] = False
return np.where(prime)[0]
```
這段代碼首先生成一個長度為n+1的numpy布爾數(shù)組prime,其中prime[i]表示i是否為素數(shù) 。然后從2開始,找到第一個素數(shù)p,將p的所有倍數(shù)都標記成合數(shù),即prime[p*p:n+1:p]都設為False 。這里用到了numpy數(shù)組的切片和步長操作,可以一次性標記多個數(shù) 。最后返回所有為素數(shù)的數(shù) 。
方法五:多線程優(yōu)化
我們可以用多線程來優(yōu)化素數(shù)篩法,將篩數(shù)的任務分給多個線程同時處理,可以大大提高效率 。代碼如下:
```python
import threading
def eratosthenes_mt(n, num_threads=4):
猜你喜歡
- 工資計算方法是如何計算
- 養(yǎng)生常識 飯后保健不如飯前養(yǎng)生有益健康
- Photoshop如何制作三角形?
- 如何關閉系統(tǒng)還原
- 如何使卵巢減緩衰老呢?
- 求各種動物叫聲的擬聲詞如汪汪
- 女人怎樣補鈣呢
- 如何讓來電只顯示姓名
- 獻血后如何保護針眼
- 冬季如何穿衣 抗寒保暖試試洋蔥式穿衣法
