利用構建素數表的方法快速得到素數

2021-10-02 08:30:59 字數 1074 閱讀 6413

今天在東華oj上做了一道題,基礎部分第40題:分拆素數和,涉及到素數。

我覺得題目不難,我是這樣寫的:

/*

t40 分拆素數和

演算法概述:對於乙個偶數num,從2到num/2 - 1依次測試拆分是否滿足要求

*/#include#include// 判斷是否為素數

int isprim(int x)}

return 1;

}int main()

}printf

("%d\n", count)

;

t--;}

return 0;

}

上述**中涉及到了素數的判斷,我感覺每次都要從2到sqrt(x)測試太麻煩了,時間複雜度一下子就上去了。我想到之前好像在**見過判斷素數比較快的方法,好像叫什麼素數表,於是就去搜了下,果然找到了一種類似的辦法:

要找出從2到n之間的所有素數,可以設定乙個標記陣列isprime,isprime[x]為0代表x不為素數,isprime[x]為1代表x為素數,初始時陣列均設定為1。然後從2到n-1逐個判斷,若2到n-1的某個數x為素數,那麼x的兩倍,三倍,四倍,五倍……一直到k*i達到n之間的所有的數都不為素數了,因為它們除了1和本身,至少還有乙個因數x。

稍微改下**:

/*

t40 分拆素數和

演算法概述:對於乙個偶數num,從2到num/2 - 1依次測試拆分是否滿足要求

*/#include#include// 構建素數表

void primearray(int primeflag, int n)

for (i = 2; i < n; i++)}}

}int main()

}printf

("%d\n", count)

;

t--;}

return 0;

}

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

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

素數的快速判斷方法

大於等於5的素數與6的倍數相鄰 所有自然數可以用集合a 表示,其中n 0,顯然,子集b 內的元素都不是素數,所以只有6n 1和6n 5可能是素數,素數一定可以用6n 1和6n 5其中的乙個形式表示,即大於等於5的素數與6的倍數相鄰 上面說到大於或等於5的素數一定可以用6n 1或者6n 5來表示,在判...

關於快速尋找素數的方法

利用素數篩選法進行素數的快速查詢。原理很簡單,素數一定是奇數,素數的倍數一定不是素數。思路如下 預定義n表示10000,即表示查詢10000以內的素數,首先定義陣列prime對n以內的數進行標記,奇數存為1,偶數存為0,最終實現結果為素數的prime值為1,因此將prime 2 賦值為1 2是素數 ...