二、埃氏篩
三.尤拉篩法
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都存在直觀可見的因子,故不會為素數。
僅僅提供思路,理解後能靈活運用即可
**如下:
顯而易見,當n取值過大時,一次次的判斷將極大地影響工作效率,特別是在解決一些有時間要求的演算法題時,這樣的思路很容易引發超時。#
include
#include
using
namespace std;
intmain()
}(m==1)
?cout<<
"no"
:cout<<
"yes"
;}
任一合數僅能被唯一分解成有限個素數的乘積,意味通過對乙個已知質數的處理可以選擇出其他與之相關的合數,比如2為質數,通過對2的倍數處理,可以選出4,6,8等以2為因子的合數。
時間複雜度為o(n* log log n)
**如下:
以12為例,在整個標記過程中,在處理2的倍數時,被標記過了一次,然後在處理3的倍數時,又被重新標記了一次,若資料較小,則影響不大,但在提交答案時,系統會測試一些處於邊界條件下的資料,一次次的重複標記同樣會影響效率,可能會導致超時。#
include
#include
using namespace std;
int a[
100005];
int vis[
100005];
voidf(
int n)}}
}int
main()
}
埃氏篩存在重複標記的問題,那麼想解決這個問題,就需要對每次對合數的標記進行乙個規範,從而達到乙個合數將有且只有一種標記方式,我們想到的方法是將乙個合數化為其最小質因數與另乙個數之積。
時間複雜度為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...