常規的判斷1-n以內的素數的時間複雜度為o(n*sqrt(n)),在n很大的時候時間很長,所以需要別的方法來判斷素數。這裡介紹篩選法。
1、申請乙個陣列bool prime[n+1],初始化所有的奇數下標為true,偶數下標為false(2例外)。
2、
for(int i=3;i<=sqrt(n);i+=2)}
3、最後輸出陣列中為true的那些下標,就是1-n以內的素數了。
當然這個陣列可以用位圖來表示,節省空間。
對於篩選法,還可以進一步優化。由於偶數幾乎全是合數,因此我們陣列中只存奇數,不存偶數,則下標0對應3,下標1對應5,下標2對應7...下標i對應3+2*i。則在迴圈中遍歷到下標i是素數,則將下標i*(2*t+1)+3*t(t=1,2,3…)設定為false。
素數判斷與素數篩選法
方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...
素數篩選法
篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...
素數篩選法
素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...