欧拉筛法求素数
将所有合数标记,保证不被重复筛除,时间复杂度为O(n)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 3000050;
int prime[maxn];
int vis[maxn];
int Prime(int n) {
int cnt = 0;
memset(vis, 0, sizeof(vis));
for (int i = 2; i < n; i ++) {
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && i * prime[j] < n; j ++) {
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
return cnt;
}
int main()
{
int n;
scanf("%d", &n);
int ans = Prime(n);
cout << ans << endl;
for (int i = 0; i < ans; i ++) {
cout << prime[i] << " ";
}
}