篩素數的方法

2022-10-09 17:33:12 字數 938 閱讀 7160

思路:將當前數i的所有倍數(一定是合數)篩掉。

如:當i=2時,將4,6,8,10...篩掉,當i=3時將6,9,12...篩掉。

很明顯這種篩法有很多元素被重複篩了,如篩6時,i=2時篩了一遍,i=3時又篩了一遍。

**:

int prime[n], cnt;

bool st[n];

void isprime(int n)}}

}

該種方法完美解決了上面曬法有些元素會被重複篩多次的缺陷。

思路:篩掉當前數i的某些質因數倍的數:從小到大列舉所有質數,若當前質數能被i整除,立即跳出迴圈。

這種方式被篩掉的數,都是被它的最小質因數乘上某個數篩掉的,比如15的最小質因數是3.

如:i=2,篩掉4;

i=3,篩掉6,9;

i=4,篩掉8;

i=5,篩掉10,15,25;

i=6,篩掉12;

從上圖也可看出,每個合數只被劃掉了一次。

原因如下:當i=6時,只篩到了12就結束了,並沒有篩掉18,因為18=2 * 3 * 3;也就是說,i=9時,也可以把18篩掉。

18的最小質因數是2,因為每次迴圈prime[j]都是從2開始,也就是說,18必然會被2*9篩掉。

**:

int prime[n], cnt;

bool st[n];

void isprime(int n)}}

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

節約空間的篩素數方法

節約空間的篩素數方法 求不超過n的所有素數,比較好的演算法是埃拉託斯特尼篩法 給出要篩數值的範圍n,找出 sqrt以內的素數p p dots,p 先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷...

素數判定,素數篩

這些零碎的知識點每個都學過n次了,但隔一段時間就會忘,記錄下來 素數定義 只能被自身和1整除的大於1的正整數 通過這個定義,我們就可以得出判斷素數的 這裡用到了cmath中的sqrt函式,其原型為double sqrt double 所以在取上界的時候,為了避免double帶來的精度丟失,寧可多列舉...