所謂線性篩法,顧名思義它是線性的篩素數的方法,所以是o(
n)的
int getprime(int lim)
}}
這是普通篩法
int getprime(int lim)
}}
這是線性篩法
某神犇已經測過,我直接上結果
可以發現,普通篩法將每個質數的倍數都篩掉,每個合數都被篩了它的質因子次that』s too slow!!
我們再看線性篩法
篩的時候,把當前到的這乙個數(不論質數合數)乘上篩出來的每個質數篩一遍
關鍵是這一句
if (!(i%prime[j])) break;
這樣的情況,意思是pr
ime[
j]這乙個質數在pr
ime[
j]×i
中指數已經大於等於2了。
並且,這個合數的任何倍數以後一定會被pr
ime[
j]篩到
所以後面的都不必篩了。
這樣,每個合數都只被它的最小的質因子篩過一遍,所以是線性的複雜度。
線性篩法(尤拉篩法)
嗯在剛剛 沒錯就是在幾分鐘之前 我學會了線性篩法 實在是乙個很好的篩法 正常的篩法,都會對乙個數篩多次 但是尤拉篩法不會 尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的 我們假設乙個數k,它是t的最大因數 容易知道t是不唯一的 那我們要乘以乙個質...
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...
線性篩法(尤拉篩)
從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把1 n以內素數的整數倍的數字劃掉,留下的就全是素數,但是它的複雜度是o nlglgn 對於大量不友好資料會跪,於是線性曬登場了。include using namespace std int prime 1100000 primesize,ph...