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