筛选法判断素数

常规的判断1-n以内的素数的时间复杂度为O(n*sqrt(n)),在n很大的时候时间很长,所以需要别的方法来判断素数。这里介绍筛选法。

1、申请一个数组bool prime[n+1],初始化所有的奇数下标为true,偶数下标为false(2例外)。

2、

for(int i=3;i<=sqrt(n);i+=2)
{
    if(prime[i])
    {
        for(int j=i+i;j<=n;j+=i)
            prime[j]=false;
    }
}

3、最后输出数组中为true的那些下标,就是1-n以内的素数了。

当然这个数组可以用位图来表示,节省空间。

 

对于筛选法,还可以进一步优化。由于偶数几乎全是合数,因此我们数组中只存奇数,不存偶数,则下标0对应3,下标1对应5,下标2对应7...下标i对应3+2*i。则在循环中遍历到下标i是素数,则将下标i*(2*t+1)+3*t(t=1,2,3…)设置为false。

posted @ 2012-08-21 09:38  Cavia  阅读(334)  评论(0编辑  收藏  举报