時間複雜度為o(n),比埃拉託色尼篩法快(埃氏篩法為 o(nloglogn)),原理是乙個合數只用它最小的質因數篩去。
圖表如下:
i素數表篩去2
34(不篩3*4=12,因為它有更小質因數2)56
………以此類推
#include
using namespace std;
bool isprime[
10000001];
int prime[
5000000];
intmain()
for(
int i=
2;i<=n;i++
)while(1
) isprime[i*prime[k]]=
0; if
(i%prime[k]==0
)break
; k++;}
k=0;
} cout<<
"prime numbers:"
int i=
0;i<=j-
1;i++
)return0;
}
希望對大家有幫助。 素數線性篩法(尤拉篩)
之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...
素數判定(素數篩法)(尤拉)
這裡主要說一下素數篩法,該方法可以快速的選取出1 n數字中的所有素數。時間複雜度遠小於o n sqrt n 方法為 從2開始,往後所有素數的倍數都不是素數。最後剩下的數都是素數。再說說尤拉公式,用來解決所有小於n中的數字有多少個與n互質,用 n 表示。n n 1 1 q1 1 1 q2 1 1 qk...
尤拉篩法求素數
尤拉篩法通過不篩除篩除過的數來將時間複雜度優化到 尤拉篩法求素數 首先,我們知道當乙個數為素數的時候,它的倍數肯定不是素數。所以我們可以從2開始通過乘積篩掉所有的合數。將所有合數標記,保證不被重複篩除,時間複雜度為o n 比較簡單 求小於等於n的素數的個數 include includeusing ...