素數的判斷和素數表

2021-09-12 18:16:26 字數 971 閱讀 4793

素數問題自己之前也接觸過,這裡做乙個系統的總結:

一、素數的判斷

首先要明白什麼是素數:

素數就是只能被1和自己整除的整數,不符合該條件的稱為合數;

所以當我們判斷乙個數是否是素數的時候,最直接粗暴的演算法就是對2~n-1進行列舉,如果存在約數k,滿足n%k=0;

此時,這個數就不是素數,為合數;

但是該方法的時間複雜度到達了o(n),我們可以依據數學的特性進行化簡;

對於乙個k,我們可以由n/k=n/k變形為k*(n/k)=n,如果k滿足n%k=0,則n%(n/k)=0也滿足,因為n/k也為n的乙個約數,對於k和n/k,必有乙個小於sqrt(n)。所以對於我們來說,沒必要列舉那麼多,只需要列舉2~sqrt(n)範圍,其中sqrt(n)向下取整;

此時演算法那就優化到了o(sqrt(n));

所以判斷素數的**如下所示;

bool isprime(int n)

return true;

}

二、素數表

所謂素數表就是羅列出給定範圍內的素數;

對於該問題,最簡單的就是羅列範圍內的每乙個數,判斷其是否為素數;

時間複雜度大概是o(n)*o(sqrt(n));

對於該問題,有更好的演算法,稱為埃氏篩法,核心就是乙個篩字;

對於給定的序列,從2開始列舉,當乙個數為素數的時候,剔除給定序列範圍內2的倍數。並且每一步篩完之後遇到的第乙個數必為素數(原因是如果不為素數,則證明有更小的因子,這和前面的操作衝突);

該演算法複雜度為o(nloglogn)

const int maxn=101;

int prime[maxn],pnum=0;

bool p[maxn]=;

void find_prime(){

for(int i=2;i我們可以利用vis bool陣列來進行甄別該元素是否為素數;

判斷素數與產生素數表(質數)

素數在小學數學也叫質數 方法 所謂素數是指除了1和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被2 16的任一整數整除。因此判斷乙個整數m是否是素數,只需把m被2 m 1之間的每乙個整數去除,如果都不能被整除,那麼m就是乙個素數。另外判斷方法還可以簡化。m不必唄2 m 1之間的每...

素數距離問題(素數表)

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入 第一行給出測試資料組數n 0輸...

關於素數表的製作以及利用素數表的快速素數判斷方法

第一次寫部落格,紀念我轉行2星期。昨天晚上刷codewar的題目,心血來潮想能不能用歐幾里得篩法重新做快速素數判斷方法呢?這個方法雖然說空間複雜度要遠遠高於試除法。voidgenerateprime intn loop for primelist index 0 primelist index pr...