埃氏筛:
复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
int primes[maxn],cnt;
int book[maxn];
for(int i = 2; i <= n; i++){
if(!book[i]){
primes[++cnt] = i;
for(int j = i + i; j <= n; j += i)
book[j] = 1;
}
}
线性筛:
复杂度
O
(
n
)
O(n)
O(n)
线性筛用的思想是每个数只会被最小的质因子筛去,
int primes[maxn],cnt;
int book[maxn];
for(int i = 2; i <= n; i++){
if(!book[i])primes[++cnt] = i;
for(int j = 1; primes[j] <= n / i; j++){
book[primes[j] * i] = 1;
if(i % primes[j] == 0)break;//在i被质数整除之前,都不是i的质因子
}
}