【原始】
时间复杂度O(n*sqrt(n))
bool isprime(int n)
{
for(int i=2;i<=sqrt(n);i++)
{
i return false;
}
return true;
}
【普通筛——埃拉托斯特尼(Eratosthenes)筛法】
时间复杂度O(nloglogn)
int prime[MAX_N];
bool isprime[MAX_N];
int solve(int n)
{
int cnt=0;
for(int i=0;i<=n;i++)
isprime[i]=true;
isprime[0]=isprime[1]=false;
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
prime[p++]=i;
for(int j=2*i;j<=n;j+=i)
isprime[j]=false;
}
}
return cnt;
}
【线性筛——欧拉Euler筛】
时间复杂度为O(n)
#define MAXN 1000000
int prime[MAXN],v[MAXN];
//a[i] i 为质数则为0,否则为 1
//prime[j] 表示第 j 个质数
int m=0;//m表示现在筛出m个质数
void primes()
{
for(int i=2;i<MAXN;i++)
{
if(v[i]==0)//如果v[i]为0,说明 i 之前没有被筛到过,i 为质数
prime[++m] = i;
for(int j = 1;j<=m;j++)//遍历小于 i 的所有质数
{
int t = prime[j];
//乘起来大于MAXN就跳出循环
if(t*i > MAXN)
break;
v[i*t] = 1;//标记 i*prime[j] 的最小质因数是prime[j]
//当遇到最小的质数是i的因数时,break
if(i%t==0)
break;
}
}
}