埃式素數篩選 filter

2021-08-18 13:51:28 字數 909 閱讀 9666

把廖雪峰**的描述稍微修改了一下:

計算素數的乙個方法是埃式篩法,它的演算法理解起來非常簡單:

首先,構造出乙個奇數序列:

3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25...

先返回2

取序列的第乙個數3,它一定是素數,返回3,然後用3把序列的3的倍數篩掉:

5, 7, 11, 13, 17, 19, 23, 25, ...

取新序列的第乙個數5返回5,然後用5把序列的5的倍數篩掉:

7, 11, 13, 17, 19, 23, ...

不斷篩下去,就可以得到所有的素數

def is_odd():

n = 1

while true:

n += 2

yield n

def not_divisible(n):

return lambda x: x % n > 0 #lambda相當於乙個簡潔的函式,其中x是引數

def is_prime():

yield 2

l = is_odd()

while true:

n = next(l)

yield n

l = filter(not_divisible(n), l) #n傳進去的n相當於函式體內的x值

for x in is_prime():

if x < 100:

print(x)

else:

break

詳解利用filter函式求解素數 埃氏篩選

filter函式 篩選函式 有兩個引數,第乙個引數是乙個函式,第二個函式是乙個序列。把函式依次作用於序列的元素,根據返回值判斷保留還是丟棄這個元素。filter函式最後返回的是乙個filter物件 迭代器物件 計算素數的乙個方法就是埃氏篩法,它的演算法理解起來非常簡單 首先,列出從2開始的所有自然數...

埃式篩選法

題目 給定整數n,請問n以內有多少個素數?n 1e6 樣例輸入1 11輸出 5樣例輸入2 1000000 輸出78498 演算法詳解 i從2開始遍歷,2肯定是素數那麼他的倍數肯定不是素數,標記下來,然後遍歷沒被標記的數。遍歷完所有就只剩下沒被標記的素數了。參考 include include usi...

埃氏篩法 素數的快速篩選

埃氏篩法的的核心是 素數的倍數都不是素數。那我們執行這樣乙個策略,我們可以確定的是 2 是最小的素數,建立乙個表並將除了 0 1 外的所有數標記為素數,我們將篩選範圍內的 2 的倍數全部標記為合數 非素數 然後取出表中最小的素數,執行相同的策略 講素數的倍數標記為非素數 下圖可以完美的演示這樣乙個演...