素數篩法的關鍵就在一個「篩」字。算法從小到大枚舉全部數,對每個素數,篩去它的全部倍數,剩下的就都是素數了。ios
例如:求1-15中的全部素數。算法
一、 2是素數(惟一須要事先肯定的),所以篩去2的全部倍數,即四、六、八、十、十二、14;spa
二、 3沒有被前面的步驟篩去,所以3是素數,篩去全部3的倍數,即6,9,12,15;blog
三、 4已經在1中被篩去,所以4不是素數;ci
四、 5沒有被前面的步驟篩去,所以5是素數,除去全部5的倍數,即10,15;io
五、 6已經在1中被篩去,所以6不是素數;class
六、 7沒有被前面的步驟篩去,所以7是素數,篩去全部7的倍數,即14;stream
七、8已經在1中被篩去,所以8不是素數;im
八、9已經在2中被篩去,所以9不是素數;di
九、10已經在1中被篩去,所以10不是素數;
十、11沒有被前面的步驟篩去,所以11是素數,篩去全部11的倍數,可是15內沒有;
十一、12已經在1中被篩去,所以12不是素數;
十二、13沒有被前面的步驟篩去,所以13是素數,篩去全部13倍數,可是15內沒有;
1三、14已經在1中被篩去,所以14不是素數;
1四、15已經在2中被篩去,所以15不是素數;
至此,1-15內的全部素數已經所有獲得。
#include <iostream> #include <cstdio> using namespace std; const int SIZE = 1e7; int prime[SIZE]; // 第i個素數 bool is_prime[SIZE]; //true表示i是素數 int slove(int n) { int p = 0; for(int i = 0; i <= n; i++) is_prime[i] = true; //初始化 is_prime[0] = is_prime[1] = false; //0,1不是素數 for(int i = 2; i <= n; i++) { if(is_prime[i]) //這裏比較巧妙, 我只是意會 { prime[p++] = i; //計算素數的個數,也記錄下了素數 for(int j = 2 * i; j <= n; j += i) // 除掉了i的倍數的數字 is_prime[j] = false; } } return p; } int main() { int n; while(cin >> n) { int res = slove(n); cout << res << endl; for(int i = 0; i < res; i++) cout << prime[i] << endl; } }