如果題目只需要判斷少量數字是否為素數,那麼可以直接列舉因子從2一直到sqrt(n),看能否整除,當判斷的數量較大的,需要使用篩法進行處理。
篩法求素數就是先認定所有的數是素數,再通過一些方法把合數踢掉。
例項**:
class solution
boolean prime=new boolean[n];
arrays.fill(prime,true);
for(int i=2;i*i基本思路是,假如乙個數是素數,那麼這個數的倍數就是合數,這樣就可以將這些合數篩掉。
通過仔細分析可以發現,這樣的做法會造成重複篩合數,影響效率,比如30,在i=2的時候2 * 15判斷了一次,在i=3的時候3 * 10又判斷了一次,同理在i=5等位置進行了重複判斷,因此便有了改進的篩法。
快速線性篩在普通篩法的基礎上,消除了冗餘:
class solution
boolean prime=new boolean[n];
int primes=new int[n];
arrays.fill(prime,true);
int count=0;
for(int i=2;i演算法理解:
首先明確乙個條件,任何合數都可以表示成一系列素數的乘積:
n =p
1x1×
p2x2
×...
×pnx
nn=p_1^\times p_2^\times...\times p_n^
n=p1x1
×p
2x2
×..
.×pn
xn
從以上式子可以得到,p1是最小的因子,這樣每個合數就有乙個唯一的表示方法,不會重複:
最 小的
素數(p
1)×其
他(n/
p1
)最小的素數(p_1) \times其他(n/p1)
最小的素數(
p1)
×其他(
n/p1
) 現在我們規定乙個合數由兩個數得到,那麼合數有兩種:
篩除過程:
首先,不管i是否是素數,都會執行到「關鍵處1」。
下面舉個例子來直觀理解:
i =2
×3×5
i=2\times3\times5
i=2×3×
5 此時可以篩除2×i
2\times i
2×i,不能篩除3×i
3\times i
3×i
如果可以篩除3×i
3\times i
3×i的話,當i′i'
i′等於i ′=
3×3×
5i'=3\times3\times5
i′=3×3
×5的時候,篩除2×i
′2\times i'
2×i′
就和前面重複了
練習題:
leetcode 204
愛拉托斯特尼篩+尤拉篩
素數篩 埃拉託斯特尼篩和尤拉篩
題目描述 給定乙個範圍 n,有 q 個詢問,每次輸出第 k 小的素數。輸入格式 第一行包含兩個正整數 n,q分別表示查詢的範圍和查詢的個數。接下來 q行每行乙個正整數 k,表示查詢第 k小的素數。輸出格式 輸出 q 行,每行乙個正整數表示答案。輸入輸出樣例 輸入100 512 345輸出 2357 ...
埃拉託斯特尼篩法
質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。怎麼判斷n以內的哪些數是質數呢?厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法 先將2 n的各數放入表中,然後在2的上面畫乙個圓圈,然後劃去2的其他倍數 第乙個既未畫圈又沒有被劃去的數是3,...
埃拉託斯特尼篩法
埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。要得到自然數n以內的全部素數,必須把小於等於根號n的所有素數的倍數剔除,剩下的就是素數。這是什麼意思呢?以100為例,我們先建立乙個擁有101 0 100 個數字的陣列。先使用最小的素數2,將所有2...