标准筛素数法
核心代码:
const int MAXN=1005;
bool flag[MAXN];
int primes[MAXN/3],pi;
void prime()
{
int i,j;pi=0;
memset(flag,false,sizeof(flag));
for(i=2;i<MAXN;i++)
{
if(!flag[i]) primes[pi++]=i;
for(j=0;(j<pi)&&(i*primes[j]<MAXN);j++)
{
flag[i*primes[j]]=true;
if(i%primes[j]==0) break;//保证非素数只筛一次
}
}
}
同样素数打表可用以下代码:
int prime_table()
{
int flag=1,i,j;
memset(bo,0,sizeof(bo));
bo[0]=bo[1]=1;
for(i=2;i<=1000;i++)
{
if(!bo[i])
{
j=i*i;
for(;j<=1000000;j+=i)
{
bo[j]=1;
}
}
}
for(i=0;i<=10000;i++)
{
if(!bo[i])
prime[flag++]=i;
}
return flag;
}
埃氏筛素数:从2的倍数开始筛其倍数然后3....反复操作
核心代码:
for(int i=2;i<=n;i++)
{
if(isprime[i]) //isprime[0]=false;isprime[1]=false;
{
prime[cnt++]=i; //初始cnt=0;
for(int j=i+i;j<=n;j+=i)
{
isprime[j]=false;
}
}
}