素數篩類似於打表標記,預先處理掉非素數的數,即素數的倍數(任意非素數都可以由幾個素數相乘得到),於是效率比暴力求解快得多。
埃氏篩法的效率為o(n loglog n),簡單易懂,但是會重複標記,比如當i為2時,6會被標記掉,然而當i為3時,6又會被重複標記,這樣的重複訪問加大了時間複雜度,於是有了尤拉篩。
1 #include2 #include3 #include4 #include5using
namespace
std;
6bool v[100000055];7
void ss(intn)8
17}18}
19int
main()
2034 cout35 finish=clock();
36 totaltime=(double)(finish-start)/clocks_per_sec;
37 cout<<"
\n此程式的執行時間為
"<"秒!"
<38return0;
39 }
尤拉篩的時間複雜度為o(n),就是線性。注釋為本人拙見,水平有限見諒。
1 #include2 #include3using
namespace
std;
4int v[10000000],f[10000000];5
int ss(intn)6
2021}22
return cnt;//
n以內素數的個數 23}
24int
main()
25
篩法求素數 線性篩法求素數
2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...
求素數,判斷素數,篩法
1.判斷素數 時間複雜度 o sqrt n 空間複雜度 o 1 include include sqrt函式標頭檔案 using namespace std bool prime int n return 0 不足之處 很多數被處理了不止1遍,比如6,在素數為2的時候處理1次,為3時候又標記一次,因...
篩法求素數
素數篩法就是每次把已知的素數的倍數曬去,篩掉前sqrt n 中素數的倍數就可以了 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數...