一、暴力筛法
枚举每个数,判断是否有正整数能整除这个数。代码如下:
for(int i = 2; i <= n; i ++){
bool flag = 0;
for(int j = 2; j*j<=i; j ++){
if(i % j == 0){
flag = 1;
break;
}
}
if(!flag){
tot++;
p[tot]=i;
}
}
二、埃式筛法
既然每个合数必然能分解成多个素数的乘积,那么在搜索到一个数为素数的时候,我们就把它的倍数标记成为合数。代码如下:
for(int i = 2; i <= n; i ++){
if(prime[i] == 0){
p[++tot]=i;
for(int j = 2; j * i <= n; j ++){
prime[j*i] = 1;
}
}
}
三、欧拉筛法
欧拉筛法的基本思想是在埃式筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。代码如下:
for(int i = 2; i <= n; i ++){
if(!arr[i]){
prime[tot++]=i;
}
for(int j = 0; j < tot && i*prime[j] <= n; j ++){
arr[i*prime[j]] = 1;
if(i%prime[j] == 0){
break;
}
}
}