[数论] 线性素数筛

采用素数筛筛选出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;
}

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/82933482