Eratosthenes
原理:质数的倍数都是合数
欧拉筛
原理:合数只会被它的最小质因子筛掉
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int MAXN = 105;
typedef long long ll;
bool vis[MAXN];//筛完之后 vis[x]=1 -> x不是素数,vis[x]=0 -> x是素数
int prime[MAXN + 1];//prime[0]存储素数个数,prime[1]开始......存储素数,构成素数表
void Eratosthenes(ll n) {
memset(vis, 0, sizeof(vis));
vis[0] = vis[1] = 1;//0和1不是素数!!!
for (int i = 2; i <= sqrt(n + 0.5); i++)
if (!vis[i])
for (int j = i * i; j <= n; j += i)
vis[j] = 1;
}
void olaprime() {
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= MAXN; i++) {
if (!prime[i])
prime[++prime[0]] = i;
for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++) {
prime[prime[j] * i] = 1;
if (!(i % prime[j]))
break;
}
}
}