204. Count Primes
Given an integer n, return the number of prime numbers that are strictly less than n.
Example 1:
Input: n = 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
Example 2:
Input: n = 0
Output: 0
Example 3:
Input: n = 1
Output: 0
Constraints:
- 0 < = n < = 5 ∗ 1 0 6 0 <= n <= 5 * 10^6 0<=n<=5∗106
From: LeetCode
Link: 204. Count Primes
Solution:
Ideas:
1. Edge Cases: If n is less than or equal to 2, there are no prime numbers less than n, so we return 0.
2. Initialization: We create an array isPrime of size n and initialize all elements to true. This array will helpus mark non-prime numbers.
3. Sieve of Eratosthenes:
- For each number i starting from 2 up to the square root of n, if i is still marked as prime (isPrime[i] is true), we mark all its multiples as non-prime.
- The inner loop starts at i * i because any smaller multiple of i would have already been marked by a smaller prime factor.
4. Counting Primes: After marking non-prime numbers, we iterate through the isPrime array and count how many numbers are still marked as prime.
5. Memory Management: Finally, we free the allocated memory for the isPrime array and return the count of prime numbers.
Code:
c
int countPrimes(int n) {
if (n <= 2) {
return 0;
}
bool *isPrime = (bool *)malloc(n * sizeof(bool));
for (int i = 2; i < n; ++i) {
isPrime[i] = true;
}
for (int i = 2; i * i < n; ++i) {
if (isPrime[i]) {
for (int j = i * i; j < n; j += i) {
isPrime[j] = false;
}
}
}
int count = 0;
for (int i = 2; i < n; ++i) {
if (isPrime[i]) {
++count;
}
}
free(isPrime);
return count;
}