求素数是比较基本的内容,有时候我们会需要打一个素数表。一般如果n比较小我们会使用(%2~sqrtn)这种算法,简单但是时间耗费很多,复杂度是O(n^2)。这里介绍一种筛选求素数法,基本要点是,如果找到一个素数如3,那么就往后筛出所有3的倍数。
一般筛选求素数:
void init()
{
memset(prim, true, sizeof(prim));
for (int i = 2; i*i <= maxn; i++)
{
if (prim[i]) //如果是素数就把其倍数全删掉
for (int j = i; i*j <= maxn; j++)//j从i开始可以避免一部分重复
prim[i*j] = false;
}
}
这个方法比一般的打表法快,但运算中间有大量重复,如:i=2时,筛除30=2*15,但i=5时,筛除30=5*6,重复的标示了。
void init()
{
for (int i = 2; i < maxn; i++)
{
if (!map[i])
{
for (int j = i; j < maxn; j+=i)
map[j] = map[j / i] + 1; //这样还可以统计i由几个素因子构成
}
}
}
线性筛选求素数:
void init()
{
memset