埃氏篩

埃拉托斯特尼篩法,簡稱埃氏篩,一種古老且簡單的用來找出一定范圍內(nèi)所有的質(zhì)數(shù)的算法。公元前250年由希臘數(shù)學家埃拉托斯特尼提出

abstract.png

算法原理

判斷自然數(shù)n以內(nèi)的全部質(zhì)數(shù),將不大于\sqrt{n} 的所有質(zhì)數(shù)的倍數(shù)剔除,剩下的即為該自然數(shù)n以內(nèi)的所有質(zhì)數(shù)

Step 1. 先設定整個序列2,3,4,5, … , n-1,均標記為質(zhì)數(shù)

Step 2. 取出整個序列的第一個質(zhì)數(shù) P,此時為 2

Step 3. 將該質(zhì)數(shù)在n以內(nèi)的倍數(shù)全部標記為非質(zhì)數(shù)

Step 4. 根據(jù)標記信息按序取該序列中下一個質(zhì)數(shù)Q(此時為3),先判斷其平方值是否超過n,如果是,則該算法結(jié)束,質(zhì)數(shù)與否標記完成;否則,返回Step 3

Java實現(xiàn)

public int countPrimes(int n) {
    boolean[] notPrime = new boolean[n];
    int num = 0;
    for(int i=2; i<n; i++)
    {
        if(!notPrime[i])
        {       
            num++;
            for(int j = 2; i*j < n; j++)    // 將該質(zhì)數(shù)的倍數(shù)標記為非質(zhì)數(shù)
            {
                notPrime[i*j] = true;
            }
        }
    }
    return num;
}

Note

之前筆者在解決該問題是對n以內(nèi)所有數(shù)依次進行質(zhì)數(shù)判斷,結(jié)果發(fā)現(xiàn)費時費力…………

不得不感嘆,古人的智慧是無窮的鴨…………

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容