給你一個數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是否為素數就可以了...
