如果我们要找出一个范围内的所有质数(素数)该如何处理
1.最简单的就是一个n*2的算法
for(int i = 2; i <= n; i++)
for(int j = 2; j < i; j++)
{
if(i % j == 0) break;
if(j == i - 1) prime[++cnt] = i;
}
2.因为当j*j之后是重复的所以优化
for(int i = 2; i <= n; i++)
for(int j = 2; j * j < i; j++)
{
if(i % j == 0) break;
if((j+1) * (j+1) >= i) prime[++cnt] = i;
}
3.因为我们知道2以后的质数都是奇数,所以i可以一次加2
prime[++cnt] = 2;
for(int i = 3; i <= n; i+=2)
{
for(int j = 2; j * j < i; j++)
{
if(i % j == 0) break;
if((j+1) * (j+1) >= i) prime[++cnt] = i;
}
}
4.我们可以用到线性筛,复杂度接近n了
for (int i = 2; i <= N; i++)
{
if (!mark[i]) a[++tot_a]=i;
for (int j = 1; j <= tot_a; j++)
{
if (i*a[j] > N) break;
mark[i*a[j]] = true;
}
}
5.我们发现线性筛会筛重,所以筛重时跳掉,复杂度大约是不优化的五分之一
for (int i = 2; i <= N; i++)
{
if (!mark[i]) a[++tot_a]=i;
for (int j = 1; j <= tot_a; j++)
{
if (i*a[j] > N) break;
mark[i*a[j]] = true;
if (i%a[j] == 0) break;//判断是否已筛过
}
}