找質數演算法之埃拉托色尼篩選法(Sieve of Eratosthenes演算法)
阿新 • • 發佈:2019-01-01
一、演算法原理
一個合數總是可以分解成若干個質數的乘積,那麼如果把質數(最初只知道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; } };