前言:很久很久以前,我是暴力,后来用埃筛,直到现在某一刻我才意识到欧拉筛究竟有多快。
首先,先说一下埃筛吧,埃筛就是你每找到一个质数就将它一直到N的所有数都标记了不是质数,那么你顺着这个数接着找到下一个没有没标记的数,那么它就是质数,在接着标记。
不说了,上代码:
void Aishai(int n)//这是埃筛
{
memset(isprime,-1,sizeof(isprime))
isprime[0]=isprime[1] =false;
for(int i=2;i*i<=n;i++)
{
if(isprime[i])
{
for(int j=i*2;j<=n;j+=i)
{
isprime[j]=false;//每一个数都会进行标记
}
}
}
}
然后你会发现我去,好多重复的,2*3=6,3*2=6,这要浪费多少时间啊,好心痛,呜呜呜,所以我们应该想一个办法给它在某一个位置上断掉,这样不就不重复了么,那么便有了欧拉筛。
上代码(解释在代码中)
int prime[maxn];//记录素数
int visit[maxn];//标记某个数是否为质数,是就0,不是就1,当然你也可以反过来
void Prime()