素數問題自己之前也接觸過,這裡做乙個系統的總結:
一、素數的判斷
首先要明白什麼是素數:
素數就是只能被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...