Open In App

Print prime numbers in a given range using C++ STL

Last Updated : 07 Jan, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Generate all prime numbers between two given numbers. The task is to print prime numbers in that range. The Sieve of Eratosthenes is one of the most efficient ways to find all primes smaller than n where n is smaller than 10 million or so. Examples:

Input : start = 50 end = 100
Output : 53 59 61 67 71 73 79 83 89 97

Input : start = 900 end = 1000
Output : 907 911 919 929 937 941 947 953 967 971 977 983 991 997

Idea is to use Sieve of Eratosthenes as a subroutine. Firstly, find primes in the range from 0 to start and store it in a vector. Similarly, find primes in the range from 0 to end and store in another vector. Now take the set difference of two vectors to obtain the required answer. Remove extra zeros if any in the vector.

CPP




// C++ STL program to print all primes
// in a range using Sieve of Eratosthenes
#include<bits/stdc++.h>
using namespace std;
 
typedef unsigned long long int ulli;
 
vector<ulli> sieve(ulli n)
{
    // Create a boolean vector "prime[0..n]" and
    // initialize all entries it as true. A value
    // in prime[i] will finally be false if i is
    // Not a prime, else true.
    vector<bool> prime(n+1,true);
     
    prime[0] = false;
    prime[1] = false;
    int m = sqrt(n);
 
    for (ulli p=2; p<=m; p++)
    {
     
        // If prime[p] is not changed, then it
        // is a prime
        if (prime[p])
        {
            // Update all multiples of p
            for (ulli i=p*2; i<=n; i += p)
            prime[i] = false;
        }
    }
 
    // push all the primes into the vector ans
    vector<ulli> ans;
    for (int i=0;i<n;i++)
        if (prime[i])
            ans.push_back(i);
    return ans;
}
 
// Used to remove zeros from a vector using
// library function remove_if()
bool isZero(ulli i)
{
    return i == 0;
}
 
vector<ulli> sieveRange(ulli start,ulli end)
{
    // find primes from [0..start] range
    vector<ulli> s1 = sieve(start);
     
    // find primes from [0..end] range
    vector<ulli> s2 = sieve(end);
 
    vector<ulli> ans(end-start);
     
    // find set difference of two vectors and
    // push result in vector ans
    // O(2*(m+n)-1)
    set_difference(s2.begin(), s2.end(), s1.begin(),
                            s2.end(), ans.begin());
 
    // remove extra zeros if any. O(n)
    vector<ulli>::iterator itr =
                    remove_if(ans.begin(),ans.end(),isZero);
 
    // resize it. // O(n)
    ans.resize(itr-ans.begin());
 
    return ans;
}
 
// Driver Program to test above function
int main(void)
{
    ulli start = 50;
    ulli end = 100;
    vector<ulli> ans = sieveRange(start,end);
    for (auto i:ans)
        cout<<i<<' ';
    return 0;
}


Output

53 59 61 67 71 73 79 83 89 97 

Time Complexity : O(NlogN), where N is the difference between the intervals.
Auxiliary Space : O(N), to store boolean vector.

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads