一般求素数
bool Prime(int n)
{
if(n<=1) return 0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) return 0;
}
return 1;
}
对6取余求素数
除了2和3,其余所有素数一定都在6的倍数左右两边
素数 → 6的倍数两边
6的倍数两边 ≠→ 素数
bool Prime(int n)
{
if(n<=1) return 0;
if(n==2||n==3) return 1;
if(n%6!=1 && n%6!=5) return 0; //除了2和3,所有素数对6取余等于1或5
for(int i=2;i*i<=n;i++)
{
if(n%i==0) return 0;
}
return 1;
}
埃氏筛
const int N=1000001;
bool isPrime[N];
void aiPrime()
{
memset(isPrime,1,sizeof(isPrime));
isPrime[1]=0;
for(i=2;i<=1000000;i++)
{
if(isPrime[i])
{
for(j=i*i;j<=n;j+=i) isPrime[j]=0;
}
}
}
欧拉筛
const int N=1e6+5;
int Prime[N];
bool isPrime[N];
int Prime[N];
bool isPrime[N];
void ola()
{
memset(isPrime,1,sizeof(isPrime));
for(int i=2;i<=1000000;i++)
{
if(isPrime[i]) Prime[++Prime[0]]=i;
for(int j=1; Prime[j]<=1e6/i ; j++)
{
isPrime[i*Prime[j]]=0;
if(i%Prime[j]==0) break; //保证每个数只被它的最小质因子筛一次
}
}
}