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


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

一般來說,要是對一個整數進行素數判斷,首先想到的是寫個函數判斷是否為素數,然后調用這個函數,時間復雜度為O(n^(½)),但是要求n以內的素數就略顯吃力了.

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

先看下面的代碼:

 1 /*
 2     |埃式篩法|
 3     |快速篩選素數|
    |15-7-26|
4 */ 5 #include <iostream> 6 #include <cstdio> 7 using namespace std; 8 const int SIZE = 1e7; 9 10 int prime[SIZE]; // 第i個素數 11 bool is_prime[SIZE]; //true表示i是素數 12 13 int slove(int n) 14 { 15 int p = 0; 16 for(int i = 0; i <= n; i++) 17 is_prime[i] = true; //初始化 18 is_prime[0] = is_prime[1] = false; //0,1不是素數 19 for(int i = 2; i <= n; i++) 20 { 21 if(is_prime[i]) //這里比較巧妙, 我只是意會 22 { 23 prime[p++] = i; //計算素數的個數,也記錄下了素數 24 for(int j = 2 * i; j <= n; j += i) // 除掉了i的倍數的數字 25 is_prime[j] = false; 26 } 27 } 28 return p; 29 } 30 31 int main() 32 { 33 int n; 34 while(cin >> n) 35 { 36 int res = slove(n); 37 cout << res << endl; 38 for(int i = 0; i < res; i++) 39 cout << prime[i] << endl; 40 } 41 }
2 3 4 5 6 7 8 9 10 11 12
2 3 - 5 - 7 - 9 - 11 -
2 3 - 5 - 7 - - - 11 -

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM