Count Primes

medium math enumeration

Problem

Given an integer n, return the number of prime numbers strictly less than n.

Inputn = 10
Output4
Primes < 10: 2, 3, 5, 7 → count = 4. Sieve of Eratosthenes: for each prime p in [2 .. √n], mark p², p²+p, … as composite.

def count_primes(n):
    if n <= 2: return 0
    sieve = [True] * n
    sieve[0] = sieve[1] = False
    for p in range(2, int(n ** 0.5) + 1):
        if sieve[p]:
            for m in range(p * p, n, p):
                sieve[m] = False
    return sum(sieve)
function countPrimes(n) {
  if (n <= 2) return 0;
  const sieve = new Uint8Array(n).fill(1);
  sieve[0] = sieve[1] = 0;
  for (let p = 2; p * p < n; p++) {
    if (sieve[p]) for (let m = p * p; m < n; m += p) sieve[m] = 0;
  }
  let count = 0;
  for (let i = 2; i < n; i++) if (sieve[i]) count++;
  return count;
}
class Solution {
    public int countPrimes(int n) {
        if (n <= 2) return 0;
        boolean[] sieve = new boolean[n];
        Arrays.fill(sieve, true);
        sieve[0] = sieve[1] = false;
        for (int p = 2; p * p < n; p++) {
            if (sieve[p]) for (int m = p * p; m < n; m += p) sieve[m] = false;
        }
        int count = 0;
        for (int i = 2; i < n; i++) if (sieve[i]) count++;
        return count;
    }
}
int countPrimes(int n) {
    if (n <= 2) return 0;
    vector<bool> sieve(n, true);
    sieve[0] = sieve[1] = false;
    for (int p = 2; p * p < n; p++)
        if (sieve[p]) for (int m = p * p; m < n; m += p) sieve[m] = false;
    int count = 0;
    for (int i = 2; i < n; i++) if (sieve[i]) count++;
    return count;
}
Time: O(n log log n) Space: O(n)