本文將詳細闡述兩種求素數的個數的解法,分別是暴力枚舉法和埃氏篩法,並對它們的時間複雜度和應用場景進行分析。
一、暴力枚舉法
暴力枚舉法是最樸素的解法,從2開始,依次枚舉2~n中的每一個數,判斷它是否為素數,如果是,素數個數+1。判斷某個數是否為素數,可以用它是否能被2~根號n之間的任意一個整數整除來判斷。
int countPrimes(int n) {
int count = 0;
for(int i = 2; i < n; i++) {
bool isPrime = true;
for(int j = 2; j <= sqrt(i); j++) {
if(i % j == 0) {
isPrime = false;
break;
}
}
if(isPrime)
count++;
}
return count;
}
時間複雜度為O(n*sqrt(n)),空間複雜度為O(1)。顯然,暴力枚舉法並不適用於大規模的數據。
二、埃氏篩法
埃氏篩法是一種簡單而高效的篩法,它通過一個布爾數組來記錄每個數字是否為素數,初始時將所有元素設為true,從2開始,依次枚舉2~n中的每個數,如果該數為素數,則將它的倍數都標記為非素數。最後,統計布爾數組中true的個數即可。
int countPrimes(int n) {
bool isPrime[n];
memset(isPrime, true, sizeof(isPrime));
int count = 0;
for(int i = 2; i < n; i++) {
if(isPrime[i]) {
count++;
for(int j = i*i; j < n; j += i)
isPrime[j] = false;
}
}
return count;
}
時間複雜度為O(n*log(log(n))),空間複雜度為O(n)。相比於暴力枚舉法,埃氏篩法在處理大規模數據時表現更優秀。
三、總結
以上是兩種求素數的個數的解法,暴力枚舉法適用於小規模數據,時間複雜度較高,在處理大規模數據時會出現超時等問題;而埃氏篩法是一種高效的篩法,其時間複雜度較低,處理大規模數據時表現更加卓越。
原創文章,作者:UGUDM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/373077.html
微信掃一掃
支付寶掃一掃