質數(prime number)又稱素數,有無限個。乙個大於1的
自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數;否則稱為
合數。最小的質數是2。
1.素數的判斷
由於一些題目中素數的判斷只是其中的一部分,所以如果這個時候的時間複雜度為o(n)實際上有點大了,所以我們需要更加快速的判定方法。注意到如果在2~n-1中存在n的約數,不妨設為k,即n%k == 0,那麼由k * (n/k) ==n可知,n/k也是n的乙個約數,且k與n/k中一定滿足其中乙個小於sqrt(n)另乙個大於sqrt(n),其中sqrt(n)為根號n。
所以,我們只需要判定n能否被2,3,……sqrt(n)中的乙個整除,即可判定n是否為素數,其演算法的時間複雜度為o(sqrt(n)).
**如下:
bool isprime(int n)
return true;
}
上述**中,sqrt的作用是為乙個浮點數開根號,需要新增math.h標頭檔案。
由於sqrt的引數要求是浮點數,因此在n前面需要乘上1.0使其變成浮點型。
2.素數表的獲取
用以上的方法實現素數的判斷後,時間複雜度為o(sqrt(n) ),現在要把這些素數都加到素數表中就很容易了,直接採用列舉的方法即可,而列舉部分的複雜度為o(n),所以總複雜度為o(n*sqrt(n))。這個複雜度對n不超過十的五次方的大小是沒有問題的,考試時大部分涉及素數表的題目都不會超過這個範圍,**如下:
const int maxn = 101;
int prime[maxn], pnum = 0;
bool p[maxn] = ;
void find_prime()
}}
上面演算法在n到十的五次方以內都是可以承受的,如果出現大範圍素數表需要求解,以上解法將力不從心,所以可以使用各種「篩法」,其中「埃式篩法」是最簡單的一種。
其實「埃式篩法」就是如果我發現了某乙個數是乙個素數,那麼這個數的所有倍數,都不是素數了,就把這些倍數全部篩掉了。
a[i] = i;
for(int k = 2; k < maxn; k++)
;void find_prime (int n) }}
}int main()
return 0;
}
素數距離問題(素數表)
時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入 第一行給出測試資料組數n 0輸...
求質數表 素數篩求素數 效率比較 數論相關
求質數表 素數篩求素數 效率比較 數論相關 第乙個是平時最常用的基本寫法 還有一種寫法是for j i 2 j第二個是以i i為起點開始篩的,要注意浮點溢位!第三個不太好簡潔地說清楚,詳細 程式中途分別輸出每次計算了的prime 500000 從而為了驗證計算結果的正確性的 include incl...
素數的判斷和素數表
素數問題自己之前也接觸過,這裡做乙個系統的總結 一 素數的判斷 首先要明白什麼是素數 素數就是只能被1和自己整除的整數,不符合該條件的稱為合數 所以當我們判斷乙個數是否是素數的時候,最直接粗暴的演算法就是對2 n 1進行列舉,如果存在約數k,滿足n k 0 此時,這個數就不是素數,為合數 但是該方法...