Sieve of Eratosthenes
Algorithm Explanation
The Sieve of Eratosthenes is an efficient algorithm to find all prime numbers up to a given number n
.
It works by iteratively marking the multiples of each prime number starting from 2.
Steps:
- Create a boolean array
is_prime[]
of sizen+1
, initialized astrue
. - Start from the first prime number,
p = 2
. - For each
p
, mark all multiples ofp
(fromp*p
ton
) asfalse
. - Move to the next unmarked number and repeat until
p * p > n
.
Time Complexity:
The time complexity is O(n log log n).
Space Complexity:
The space complexity is O(n) due to the boolean array.
Easy Problems
Problem 1: Count Primes Less Than N
Find the number of prime numbers less than a given integer n
.
#include <iostream>
#include <vector>
using namespace std;
int countPrimes(int n) {
vector<bool> is_prime(n, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i < n; i++) {
if (is_prime[i]) {
for (int j = i * i; j < n; j += i)
is_prime[j] = false;
}
}
int count = 0;
for (bool prime : is_prime) if (prime) count++;
return count;
}
int main() {
int n = 20;
cout << "Number of primes less than " << n << ": " << countPrimes(n);
return 0;
}
Problem 2: Print All Primes Less Than N
Print all prime numbers less than a given integer n
.
#include <iostream>
#include <vector>
using namespace std;
void sieve(int n) {
vector<bool> is_prime(n, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i < n; i++) {
if (is_prime[i]) {
for (int j = i * i; j < n; j += i)
is_prime[j] = false;
}
}
for (int i = 2; i < n; i++) {
if (is_prime[i]) cout << i << " ";
}
}
int main() {
int n = 50;
sieve(n);
return 0;
}
Intermediate Problems
Problem 3: Segmented Sieve
Find primes in a range [L, R]
using a modified sieve.
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void simpleSieve(int limit, vector<int>& primes) {
vector<bool> is_prime(limit + 1, true);
for (int p = 2; p * p <= limit; p++) {
if (is_prime[p]) {
for (int i = p * p; i <= limit; i += p)
is_prime[i] = false;
}
}
for (int i = 2; i <= limit; i++) {
if (is_prime[i]) primes.push_back(i);
}
}
void segmentedSieve(int L, int R) {
int limit = sqrt(R) + 1;
vector<int> primes;
simpleSieve(limit, primes);
vector<bool> is_prime(R - L + 1, true);
for (int p : primes) {
int start = max(p * p, (L + p - 1) / p * p);
for (int j = start; j <= R; j += p)
is_prime[j - L] = false;
}
for (int i = L; i <= R; i++) {
if (is_prime[i - L] && i != 1)
cout << i << " ";
}
}
int main() {
int L = 10, R = 50;
segmentedSieve(L, R);
return 0;
}
Problem 4: Count Twin Primes Up to N
Twin primes are pairs of primes that differ by 2 (e.g., 11 and 13).
#include <iostream>
#include <vector>
using namespace std;
int countTwinPrimes(int n) {
vector<bool> is_prime(n+1, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i)
is_prime[j] = false;
}
}
int count = 0;
for (int i = 2; i <= n - 2; i++) {
if (is_prime[i] && is_prime[i + 2])
count++;
}
return count;
}
int main() {
int n = 100;
cout << "Twin primes up to " << n << ": " << countTwinPrimes(n);
return 0;
}
Hard Problem
Problem 5: Count Prime Triplets
Find the number of prime triplets (p, p+2, p+6) or (p, p+4, p+6) less than or equal to n
.
#include <iostream>
#include <vector>
using namespace std;
int countPrimeTriplets(int n) {
vector<bool> is_prime(n+1, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i)
is_prime[j] = false;
}
}
int count = 0;
for (int i = 2; i <= n - 6; i++) {
if ((is_prime[i] && is_prime[i+2] && is_prime[i+6]) ||
(is_prime[i] && is_prime[i+4] && is_prime[i+6]))
count++;
}
return count;
}
int main() {
int n = 100;
cout << "Prime triplets up to " << n << ": " << countPrimeTriplets(n);
return 0;
}