驗證素數(素數篩選法驗證素數)

2021-06-22 22:45:34 字數 955 閱讀 6879

本來是在做容斥原理的題,既然碰到求a~b內與n互質的數的個數,就順便將與素數相關的知識整理一遍。

1、輸入數n,判斷是否為素數的一般方法:

#includeusing namespace std;

int main()

cout<

#includeusing namespace std;

int main()

cout<3、在學完素數篩選法

求素數後掌握了一種新方法。

算術基本定理

任何乙個大於1的

自然數n,都可以唯一分解成有限個質數的乘積

, 這裡p12

<...n>

,其中方冪 a

i是正整數。

例如180=2^2*3^2*5。

這樣的分解稱為n 的標準分解式。

算術基本定理的內容由兩部分構成:分解的存在性、分解的唯一性(即若不考慮排列的順序,正整數分解為素數乘積的方式是唯一的)。

根據上述定理,如果我們已經知道不大於正整數n的開方的素數有哪些,那麼驗證n為素數時,只需要判斷這些素數是不是n的約數,而不需要每次「+2」判斷能否被整除。特別是對於判斷多個很大的數是不是素數時比較管用,先找出sqrt(max) 範圍內的素數,然後判斷,比起對每個數每次「+2」判斷省事很多。當然,找素數時需要用到效率較高的素數篩選法(請參考:

//用素數篩選驗證素數

#includeusing namespace std;

#define n 50001

bool isprime[n];

int prime[5500];

int main()

}cin>>n;

bool bo=true;

if(n==1)bo=false;

else for (i=0;prime[i]*prime[i]<=n;i++)

}cout<

素數篩選法

篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...

素數篩選法

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...

素數篩選法

素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?以下 均基於打表 1 1e6 的基礎上完成 素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫 include include define maxn 1000000 10 int pri maxn int isprim...