1. 程式人生 > >[數論] 線性素數篩

[數論] 線性素數篩

採用素數篩篩選出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;
}