素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。
基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 。。n^(0.5) ,看看能否整除n。
如果需要判斷的次數較多,則先用下面介紹的辦法預處理。
首先先介紹一般的線性篩法求素數
[cpp]view plain
copy
void
make_prime()
return
; }
這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數(注意上面的 i*i , 比 i*2 要快點 ),把這些合數都篩掉,即演算法名字的由來。
但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。比如10,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。
快速線性篩法沒有冗餘,不會重複篩除乙個數,所以「幾乎」是線性的,雖然從**上分析,時間複雜度並不是o(n)。先上**
#include using namespace std;
#define n 200000
int primes[n], num_prime = 0;
int isnotprime[n] = ;
int main() ,1<=i<=n, 1<=j<=n,
我們會這麼寫
for (i=1; ifor (j=i+1; j<=n; ++j)
我們取 j=i+1 便能保證組合不會重複。快速篩法大概也是這個道理,不過這裡比較難理解,沒那麼直觀。
一般篩法求素數 快速線性篩法求素數
素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.數 5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 void make prime num prime 0 ...
一般篩法求素數 快速線性篩法求素數
tag 素數 數論 素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 void make prime num ...
一般篩法求素數 快速線性篩法求素數
tag 素數 數論 素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 cpp view plain copy ...