常用素数筛
1.暴力
bool primes(int x)
{
for(int i=2;i<=x/i;++i){
if(x%i==0) return false;
}
return true;
}
2.埃拉托斯特尼筛法(埃氏筛法)
void Primes(int x)
{
for (int i=0;i<=x;++i) prime[i]=1; //先把每个数都定义为合数
prime[0]=prime[1]=0;
for (int i=2;i<=x;i++)
{
if (!prime[i]) continue;
for (int j=i+i;j<=x;j+=i) prime[j] = 0; //将i的倍数标记为合数
}
}
该筛法可以引申为一种思想,绝不仅限于用于筛素数
3.线性筛法
该筛法是基于唯一分解定理之上
铺垫:唯一分解定理:任何大于1的自然素都可以写成有限个质数的乘积
int vis[maxn],prime[maxn]; //判断是否是质数和储存质数
inline void primes(int x){
for(int i=1;i<=x;++i){
vis[i]=tot=0;
}
for(int i=2;i<=x;++i){
if(vis[i]==0) prime[++tot]=i;
for(int j=1;prime[j]<=x/i;++j){
vis[prime[j]*i]=1;
if(i%prime[j]==0) break; //prime[j]一定是i的最小质因子
}
}
printf("%d
",tot); //质数的个数
}