普通質數篩法

2021-10-12 03:04:25 字數 2479 閱讀 4132

二、埃氏篩

三.尤拉篩法

4.質數距離

從暴力的直接迴圈開始,一步步對演算法進行優化,一步步簡化時間複雜度,並盡可能討論各種篩法的優劣,以及其中每一步的意義。

思路直接,容易被像我們這樣的新手第一時間想到,乙個質數,除了1和它本身以外不再有其他因數,那麼想知道乙個數是不是質數,乾脆直接去看看它有幾個因子

對於大於4的素數,總是可以用6x+1或6x-1來表示

討論:任意乙個自然數都可以用

6x、6x+1、6x+2、6x+3、6x+4、6x+5中的某個來表示

而6x、6x+2、6x+3、6x+4都存在直觀可見的因子,故不會為素數。

僅僅提供思路,理解後能靈活運用即可

**如下:

#

include

#include

using

namespace std;

intmain()

}(m==1)

?cout<<

"no"

:cout<<

"yes"

;}

顯而易見,當n取值過大時,一次次的判斷將極大地影響工作效率,特別是在解決一些有時間要求的演算法題時,這樣的思路很容易引發超時。

任一合數僅能被唯一分解成有限個素數的乘積,意味通過對乙個已知質數的處理可以選擇出其他與之相關的合數,比如2為質數,通過對2的倍數處理,可以選出4,6,8等以2為因子的合數。

時間複雜度為o(n* log log n)

**如下:

#

include

#include

using namespace std;

int a[

100005];

int vis[

100005];

voidf(

int n)}}

}int

main()

}

以12為例,在整個標記過程中,在處理2的倍數時,被標記過了一次,然後在處理3的倍數時,又被重新標記了一次,若資料較小,則影響不大,但在提交答案時,系統會測試一些處於邊界條件下的資料,一次次的重複標記同樣會影響效率,可能會導致超時。

埃氏篩存在重複標記的問題,那麼想解決這個問題,就需要對每次對合數的標記進行乙個規範,從而達到乙個合數將有且只有一種標記方式,我們想到的方法是將乙個合數化為其最小質因數與另乙個數之積。

時間複雜度為o(n)

#

include

using

namespace std;

int a[

100005];

int cnt=0;

int p[

100005];

voidf(

int n)}}

intmain()

}

prime distance

1.左右端點的範圍很大,但兩點間距卻不大,所以我們不必開乙個那麼大的陣列,只需要開乙個大小為1000 005的陣列就夠了,過程中把結果處理一下就可以了

2.判斷乙個數是否為素數,我們知道任何乙個自然數都可以唯一分解為質因數之積,那麼若為約數,必定存在乙個處於2到 根號n的質因數,即便原來的資料很大,我們也只需要看它在這一範圍內是否存在質因數,那麼我們也就縮減了資料

3。左端點小於2時化為2,不然後面不好確定篩選質因數大於左端點的第乙個位置

4.因為存在乘法,過程中可能會出現爆int的情況,所以直接使用long long 吧

.此處為多組輸入!!!

#

include

#include

using

namespace std;

typedef

long

long ll;

ll l,r;

ll prim[

1000005];

ll prim2[

1000005];

ll a[

1000005];

ll cnt;

ll ma,mi;

voidgp(

int n)}}

intmain()

cnt=0;

for(

int i=

0;i<=r-l;i++

) mi=ma=1;

for(

int i=

1;i(cnt<

2)cout<<

"there are no adjacent primes."

","<<<

" are closest, "

<<<

","<<<

" are most distant."

<}}

質數中的質數(質數篩法)

如果乙個質數,在質數列表中的編號也是質數,那麼就稱之為質數中的質數。例如 3 5分別是排第2和第3的質數,所以他們是質數中的質數。現在給出乙個數n,求 n的最小的質數中的質數是多少 可以考慮用質數篩法來做 input 輸入乙個數n n 10 6 output 輸出 n的最小的質數中的質數。input...

質數線性篩法 O n

埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...

Eular質數篩法

任意乙個正整數k,若k 2,則k可以表示成若干個質數相乘的形式。eratosthenes篩法中,在列舉k的每乙個質因子時,我們都計算了一次k,從而造成了冗餘。因此在改進演算法中,只利用k的最小質因子去計算一次k。而在其基礎上改進的eular篩法,其偽 為 isprime true primelist...