C/C++查找一定范圍內的素數(篩法)


本文轉自於:http://dalu.blogbus.com/logs/37977984.html

由於一個合數總是可以分解成若干個質數的乘積,那么如果把質數(最初只知道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());
            }
        } 

  如果去掉最后一個用來顯示結果的循環的話,運行Sieve(10000000)只要1秒多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM