[數論] 線性素數篩
阿新 • • 發佈:2018-11-27
採用素數篩篩選出1~n之間的素數
首先準備大小為n的陣列flag[n]經行標記, 標記為1的是不符合的, 如果沒有被標記的數字, 則放進vector陣列中, vector數組裡面都是素數, 然後在開始遍歷該vector陣列, 將i*倍的元素進行標記, 即 flag[i*prime[j]]=1, 當然前提是i*prime[j]<=n ,要用意義
當一個函式很難理解的時候, 將數字帶進去模擬一遍也是個好方法,這樣就很清晰的知道程式碼執行的流程, 比一直看高效多了
#include<iostream> #include<algorithm> #include<vector> using namespace std; int flag[10005]; //進行標記的陣列 vector<int>prime; //用來存放素數 void Prime(int n) { flag[0] = flag[1] = 1; for (int i = 2; i <= n; i++) { if (!flag[i]) prime.push_back(i); for (int j = 0; j < prime.size() && i*prime[j] <= n; j++) //遍歷prime陣列 { flag[i*prime[j]] = 1; if (i%prime[j] == 0) break; } } } int main() { int n; cin >> n; Prime(n); for (auto a : prime) //C++11新用法,這不用在意, 主要是上面的Prime()函式 cout << a << endl; return 0; }