1. 程式人生 > >找質數演算法之埃拉托色尼篩選法(Sieve of Eratosthenes演算法)

找質數演算法之埃拉托色尼篩選法(Sieve of Eratosthenes演算法)

一、演算法原理

一個合數總是可以分解成若干個質數的乘積,那麼如果把質數(最初只知道2是質數)的倍數都去掉,那麼剩下的就是質數了。

二、步驟

(1)先把1刪除(1既不是質數也不是合數)

(2)讀取佇列中當前最小的數2,然後把2的倍數刪去

(3)讀取佇列中當前最小的數3,然後把3的倍數刪去

(4)讀取佇列中當前最小的數5,然後把5的倍數刪去

.......

(n)讀取佇列中當前最小的狀態為true的數n,然後把n的倍數刪去


三、實現

問題:給一個數n,求出比n小的所有的質數有多少個

思路:用一個bool陣列,儲存n個數的狀態,初始化都為true,然後從2開始,如果2的狀態為true,就開始遍歷比n小的所有的2的倍數,將其全部置為false。把2的倍數遍歷完後,繼續往下找下一個狀態為true的數,即3,遍歷比n小的所有的3的倍數(按3*3,3*4,3*5這樣遍歷,注意不需要從3*2開始了)。.....最後剩下的狀態為true的數全為質數。

四、程式碼

class Solution {
public:
    int countPrimes(int n) {
        if(n<=1)  //小於等於1的都不是質數
            return 0;
        bool* a = new bool[n+1];
        for(int i=0; i<n; i++)
            a[i] = true;
        for(int i=2; i*i<n; i++){
            if(a[i] == true){
              for(int j=i; i*j<n; j++){
                  a[i*j] = false;
              }  
            }//if
        }//for
        int result =0;
        for(int i=2; i<n; i++){
            if(a[i])
                result++;
        }//for
        return result;
    }
};