素数筛

素数筛
http://blog.csdn.net/guiyinzhou/article/details/6437990 
由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数
(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。
例如要查找100以内的质数,首先2是质数,把2的倍数去掉;
此时3没有被去掉,可认为是质数,所以把3的倍数去掉;
再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,
而100以内的任意合数肯定都有一个因子小于10(100的开方),
所以,去掉,2,3,5,7的倍数后剩下的都是质数了。
用程序可以这样解决,引入布尔类型数组a[i],如果i是质数,
a[i]=true,否则a[i]=false。那么划掉i可以表示成a[i]=false。
 //找出n以内质数
void Sieve(int n)
{      
    bool[] a = new bool[n+1];   
    for (int i = 2; i <= n; i++) 
        a[i] = true;
    for (int i = 2; i <= Math.Sqrt(n); i++)  
    {
        if (a[i]) 
          for (int j = i; j*i <= n; j++) a[j * i] = false;  
    }          
    for (int i = 0; i <= n; i++)
    {               
         if (a[i])    
            Console.Write("{0},",i.ToString());  
            
    } 
}

另一个模版
int Prime()
{
    int i,j,k=0;
    memset(isprime,1,sizeof(isprime));
    for(i=2;i<=N;i++)
    {
        if(isprime[i])
        {
            prime[k++]=i;
            for(j=2*i;j<=N;j+=i)
            isprime[j]=0;
        }
    }
    return k;
}

  

posted @ 2012-10-03 21:04  快乐.  阅读(244)  评论(0编辑  收藏  举报