本文將詳細闡述兩種求素數的個數的解法,分別是暴力枚舉法和埃氏篩法,並對它們的時間複雜度和應用場景進行分析。
一、暴力枚舉法
暴力枚舉法是最樸素的解法,從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-hk/n/373077.html