埃氏篩法 快速篩選n以內素數的個數

2022-04-10 02:58:10 字數 897 閱讀 9566

給你乙個數n,請問n以內有多少個素數?(n <= 10e7)

一般來說,要是對乙個整數進行素數判斷,首先想到的是寫個函式判斷是否為素數,然後呼叫這個函式,時間複雜度為o(n^(½)),但是要求n以內的素數就略顯吃力了.

要是求n以內的素數個數的話,可以用埃式篩選.預處理一下.

先看下面的**:

1/*2

|埃式篩法|

3|快速篩選素數|

|15-7-26|4*/

5 #include 6 #include 7

using

namespace

std;

8const

int size =1e7;910

int prime[size]; //

第i個素數

11bool is_prime[size]; //

true表示i是素數

1213

int slove(int

n)1427}

28return

p;29}30

31int

main()

3241 }

23

4567

891011122

3-5-

7-9-

11-23

-5-7

---11

-結合這張表看看,慢慢一次次的都篩選完了..

其中最小的素數是2,將表中所有2的倍數都除去,剩下最小的數是3,不能被更小的數整除,所以是素數.再將表中3的倍數的數除去.以此類推.如果表中最小的數字是m,m就是素數.然後將表中所有m的倍數都除去...然後就可以了= =

話說要是求區間[x,y]內求素數個數的話,只要0~y的素數個數-0~x的素數個數就可以了,然後判斷x是否為素數就可以了...

埃氏篩法 素數的快速篩選

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

素數的快速篩選(埃氏篩法)

要列舉n以內的素數,可以用埃氏篩法。這是乙個與輾轉相除法一樣古老的演算法。首先,將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數全都劃去。依次類推,如果表中剩餘的最小數字是m時,m就是素數...

埃氏篩法 素數篩

埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...