1.素数判断
int isprime(int x) {
if(x<2) return 0;
for(int i=2;i<=x/i;i++){
if(x%i==0) return 0;
}
return 1;
}
2.朴素筛法
#include<bits/stdc++.h>
using namespace std;
int n;//求1到n的所有素数
bitset<10000000> pri;//0表示是素数,1表示不是素数
int isprime(int x) {
if(x<2) return 0;
for(int i=2;i<=x/i;i++){
if(x%i==0) return 0;
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++) {
if(isprime(i)) {
for(int j=i*2;j<=n;j+=i){//素数的倍数都是合数
pri[j]=1;
}
}
}
return 0;
}
3.埃氏筛法
#include<bits/stdc++.h>
using namespace std;
int n;//找出1到n的所有素数
bitset<10000000> pri;//0表示素数,1表示非素数
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(!pri[i]){//不用再一个一个判断是不是素数
for(int j=i*2;j<=n;j+=i){
pri[j]=1;
}
}
}
return 0;
}
4.欧拉筛
#include<bits/stdc++.h>
using namespace std;
int n;//找出1到n的所有素数
bitset<10000000> pri;//0表示素数,1表示非素数
int primes[10000000],pp=0;
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(!pri[i]) primes[++pp]=i;//从下标1开始制作素数表
for(int j=1;primes[j]*i<=n;j++){
pri[primes[j]*i]=1;
if(i%primes[j]==0) break;//不会重复筛掉某个数,每个合数只会被筛掉一遍
}
}
return 0;
}