1. 程式人生 > >篩選法求質數(註解)

篩選法求質數(註解)

由於一個合數總是可以分解成若干個質數的乘積,那麼如果把質數(最初只知道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++)
    {// 100以內的任意合數肯定都有一個因子小於10, 11的倍數就沒有必要求出再篩掉,因為它的1-9倍(質因子2,3,5,7)在2,3,5,7的倍數中都求過了
        if (a[i])
            for (int j = i; j*i <= n; j++) a[j * i] = false;// 求i=2,3,5,7各數的倍數時,從j=i倍開始求,比如7,求它的7倍,8倍,9倍等,因為2到6倍(乘數因子中2到6)的質因子(2,3,5)都包含在前面求的2,3,5的倍數中,所以可以略過.
    }
    for (int i = 0; i <= n; i+=2)
    {
        if (a[i])
        Console.Write("{0},",i.ToString());
    }
}