#include <iostream> #include <vector> #include <cmath> using namespace std; // Function to perform the simple sieve of Eratosthenes up to sqrt(b) vector<int> simple_sieve(int limit) { vector<bool> is_prime(limit + 1, true); vector<int> primes; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= limit; i++) { if (is_prime[i]) { primes.push_back(i); for (int j = i * i; j <= limit; j += i) { is_prime[j] = false; } } } return primes; } // Function to find all primes in the range [a, b] using the segmented sieve void segmented_sieve(int a, int b) { int limit = sqrt(b); vector<int> primes = simple_sieve(limit); // Create a boolean array for the range [a, b] vector<bool> is_prime_segment(b - a + 1, true); // Mark multiples of each prime in the range [a, b] for (int prime : primes) { int start = max(prime * prime, a + (prime - a % prime) % prime); for (int j = start; j <= b; j += prime) { is_prime_segment[j - a] = false; } } // If a is 1, then it's not a prime number if (a == 1) { is_prime_segment[0] = false; } // Output all primes in the range [a, b] cout << "Prime numbers in the range [" << a << ", " << b << "] are:" << endl; for (int i = 0; i <= b - a; i++) { if (is_prime_segment[i]) { cout << (a + i) << " "; } } cout << endl; } int main() { int a = 10, b = 50; segmented_sieve(a, b); return 0; }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter