写在前面
前段时间一直在准备期末考试,很长时间没有打理自己的博客,还好从这周开始,就是三周的小学期,时间还算富裕,争取找到之前的节奏,继续坚持下去!
这两种素数的筛选方法,第一种方法在之前的博客中使用过,但是只是顺便的提了一下,这里加了一个Euler筛选法,相对于Eratosthenes筛选法,时间复杂度更低一些
主要的参考文献:《线性筛法与积性函数》贾志鹏
Eratosthenes筛法
Eratosthenes筛选法用到的主要思想:当一个素数被发现时,那么是这个素数倍数的数一定不再是素数,运用这个思路就可以得到时间复杂度为O(N log(log(N)))的算法
void Prim(int n)
{
//Eratosthenes筛选法
memset(check,false,sizeof(check));
int tot = 0;
for(int i = 2;i <= n;i ++)
if(!check[i])
{
prim[tot++] = i;
for(int j = 2*i;j <= n;j += i)
check[j] = true;
}
}
Euler筛法
上面的Eratosthenes筛选法,我们发现一个非素数可能会有很多次被判断,比如12,可以有2*6排除,3*4排除
那么我们为了去除这种重复