給你乙個數n,請問n以內有多少個素數?(n <= 10e7)
一般來說,要是對乙個整數進行素數判斷,首先想到的是寫個函式判斷是否為素數,然後呼叫這個函式,時間複雜度為o(n^(½)),但是要求n以內的素數就略顯吃力了.
要是求n以內的素數個數的話,可以用埃式篩選.預處理一下.
先看下面的**:
1/*223|埃式篩法|
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 }
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...