首先,篩法是一種用來判斷質數的方法,可以刷出乙個質數表,所以也叫刷表法。
基本思想:
乙個整數的1以上且為整數倍是乙個合數。
我們可以從小到大列舉n以內的質數,對其不超過n的倍數進行標記,剩下未標記的數即為質數。
基本寫法:
for
(int i=
2;i<=n;i++)}
}
這時,我們會驚奇地發現時間複雜度很高。
下面我們開動腦筋,發現:乙個數可能會被多個質數重複標記。
怎麼辦呢?
所以編者翻來覆去地想,終於想到了。
顯然,小於i*i的的倍數已被小於i的質數標記過。
所以,優化後**:
for
(long
long i=
2;i<=n;i++)}
}
現在就可以做模板題:p3912 素數個數
埃式篩效果如下:
tle一組,那就只有使用更快的一種篩法:尤拉篩
尤拉篩,又稱線性篩。
基本思想:每個合數只讓其最大因數(或最小質因數)標記。
為了保證這一點,我們開乙個prime陣列,把檢查到的質數按順序放入。其作用是對於列舉到的數,可依次乘上prime陣列中元素來標記合數。
注意:在標記過程中,如果i%prime[j]==0,則停止這輪標記。
**:
for
(int i=
2;i<=n;i++
)for
(int j=
0;j*i<=n;j++)}
}
祝大家ak全場
埃式篩法 尤拉篩法
埃氏篩法是通過從小到大篩去乙個已知素數的倍數進而實現篩選的。假如我們想篩掉1 100間的所有合數,步驟如下 2是質數,篩掉所有2的倍數 3是質數,篩掉所有3的倍數 4不是質數,跳過 5是質數,篩掉所有5的倍數 6不是質數,跳過 7是質數,篩掉所有7的倍數 8不是質數,跳過 9不是質數,跳過 10不是...
埃式篩與尤拉篩
核心思想 每個質數的倍數都是合數,當發現乙個質數時就將其的倍數都變成合數。缺點 有的合數會被它的幾個質因子重複篩掉,造成了時間上的浪費。include include using namespace std int n,q,cnt,k bool isprime 100000005 int sushu...
埃式篩法和尤拉篩判斷素數
一般要判斷是是否為素數,我們通常找出了1和它本身之外是否存在可以被它整除的數。接著對判斷可以進行優化,出去偶數,判斷的邊界設定為math.sqrt number 如 以輸入101 200之間的素數為例 public static void fun1 else flag true if flag 還有...