素數篩(5種)

2021-10-04 18:17:16 字數 1062 閱讀 6183

關於篩素數大概有以下幾種方法

1.遍歷2–(n-1)判斷有沒有除一和其本身以外的因子。

2.加一點點技巧因為n=n的1/2次方乘以n的1/2次方,所以若n在2-(根號n)存在因子,則在根號n–n也存在因子,所以我們只需要遍歷2–根號n就可以判斷了。

3.埃氏篩,核心思想就是打表(當前數為素數則其倍數不為素數)

判斷素數個數模板題

具體**:

#include

//埃氏篩

using

namespace std;

#define int long long

bool a[

100000000];

//可能是因為洛谷資料太小的原因吧,才能過。。

signed

main()

}}} cout<}

4.尤拉篩(一種複雜度為o(n)的打表方法)。

尤拉篩模板題

原理:如果判斷24是否為乙個素數那麼用埃氏篩的話起碼會重複篩24三次(212,38,46),那尤拉篩就是在此基礎上只篩一次就是其最小質因數與因乙個合數的乘積(212).

具體**:

#include

//尤拉篩

using

namespace std;

bool a[

100000001];

int prime[

1000001];

intmain()

for(

int j=

1;j<=cnt&&i*prime[j]

<=n;j++)}

for(

int i=

0;i)return0;

}

特別解釋一下這步:

if

(i%prime[j]==0

)break

;//最重要的一步

若當前質因數是i的因子則為i的最小質因數,也為i*prime【j】的最小質因數就跳出迴圈.

5.miller測試法(適用於千萬級別以上的素數判斷)

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

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

模板 3種素數篩法

試除唄 不解釋。如下 p.s 我給的是乙個完整程式,一般只需要寫成void函式就可以。enor prime 1 o n sqrt n include include define maxn 10001 using namespace std int prime maxn int cnt 0 int ...

素數判定,素數篩

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