Given two numbers L and R, the task is to find the prime numbers between L and R.
Examples:
Input: L = 1, R = 10
Output: 2 3 5 7
Explanation:
Prime number between the 1 and 10 are 2, 3, 5, and 7Input: L = 30, R = 40
Output: 31 37
Approach 1:
The idea is to iterate from in the range [L, R] and check if any number in the given range is prime or not. If yes then print that number and check for the next number till we iterate all the numbers.
Below is the implementation of the above approach:
// C program to find the prime numbers // between a given interval #include <stdio.h> // Function for print prime // number in given range void primeInRange( int L, int R)
{ int i, j, flag;
// Traverse each number in the
// interval with the help of for loop
for (i = L; i <= R; i++) {
// Skip 0 and 1 as they are
// neither prime nor composite
if (i == 1 || i == 0)
continue ;
// flag variable to tell
// if i is prime or not
flag = 1;
// Iterate to check if i is prime
// or not
for (j = 2; j <= i / 2; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
// flag = 1 means i is prime
// and flag = 0 means i is not prime
if (flag == 1)
printf ( "%d " , i);
}
} // Driver Code int main()
{ // Given Range
int L = 1;
int R = 10;
// Function Call
primeInRange(L, R);
return 0;
} |
// C++ program to find the prime numbers // between a given interval #include <bits/stdc++.h> using namespace std;
// Function for print prime // number in given range void primeInRange( int L, int R)
{ int flag;
// Traverse each number in the
// interval with the help of for loop
for ( int i = L; i <= R; i++) {
// Skip 0 and 1 as they are
// neither prime nor composite
if (i == 1 || i == 0)
continue ;
// flag variable to tell
// if i is prime or not
flag = 1;
// Iterate to check if i is prime
// or not
for ( int j = 2; j <= i / 2; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
// flag = 1 means i is prime
// and flag = 0 means i is not prime
if (flag == 1)
cout << i << " " ;
}
} // Driver Code int main()
{ // Given Range
int L = 1;
int R = 10;
// Function Call
primeInRange(L, R);
return 0;
} |
2 3 5 7
Time Complexity: O((R-L)*N), where N is the number, and L and R are the given range.
Auxiliary Space: O(1)
Approach 2: (Optimized Approach)
An optimized approach of the above is to check until square root of each value instead of half. We also don’t check even numbers.
Approach:
The approach behind this solution is:
- We first print 2 if 2 is in range as 2 is the only even prime number.
- Then we iterate all the odd numbers only.
- In every iteration we check and print if the number is prime or not using isPrime function.
- In isPrime function:
- We will first deal with a few numbers such as 1, 2, 3 in a case.
- Then we deal with the numbers which are divisible by 2 and 3 in a separate case.
- For remaining numbers:
- Iterate from 5 to sqrt(n) and check for each iteration whether (that value) or (that value + 2) divides n or not.
- If we find any number that divides, then we return false.
- Again increment the value by 6 [because any prime can be expressed as 6n+1 or 6n-1].
- Iterate from 5 to sqrt(n) and check for each iteration whether (that value) or (that value + 2) divides n or not.
- If any number can’t divide the number, then we return true.
Below is the implementation of the above approach:
// C program to find the prime numbers // between a given interval #include <stdbool.h> #include <stdio.h> // Function check whether a number // is prime or not bool isPrime( int n)
{ // Check if n=2 or n=3
if (n == 2 || n == 3)
return true ;
// Check whether n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false ;
// Check from 5 to square root of n
// Iterate i by (i+6)
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
} // Function for print prime // number in given range void primeInRange( int L, int R)
{ // Skip 0 and 1 as they are
// neither prime nor composite
// and also if 2 is in range
// then print it
if (R >= 2 && L <= 2) {
printf ( "2 " );
L = 3;
}
// Making sure that L is odd before
// beginning the loop
if (L % 2 == 0)
L++;
// NOTE : We traverse through
// odd numbers only
for ( int i = L; i <= R; i += 2) {
// If number is prime print it
if (isPrime(i))
printf ( "%d " , i);
}
} // Driver code int main()
{ // Given Range
int L = 1;
int R = 10;
// Function Call
primeInRange(L, R);
return 0;
} // This code is contributed by Susobhan Akhuli |
// C++ program to find the prime numbers // between a given interval #include <bits/stdc++.h> using namespace std;
// Function check whether a number // is prime or not bool isPrime( int n)
{ // Check if n=2 or n=3
if (n == 2 || n == 3)
return true ;
// Check whether n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false ;
// Check from 5 to square root of n
// Iterate i by (i+6)
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
} // Function for print prime // number in given range void primeInRange( int L, int R)
{ // Skip 0 and 1 as they are
// neither prime nor composite
// and also if 2 is in range
// then print it
if (R >= 2 && L <= 2) {
cout << "2 " ;
L = 3;
}
// Making sure that L is odd before
// beginning the loop
if (L % 2 == 0)
L++;
// NOTE : We traverse through
// odd numbers only
for ( int i = L; i <= R; i += 2) {
// If number is prime print it
if (isPrime(i))
cout << i << " " ;
}
} // Driver code int main()
{ // Given Range
int L = 1;
int R = 10;
// Function Call
primeInRange(L, R);
return 0;
} // This code is contributed by Susobhan Akhuli |
2 3 5 7
Time Complexity: O((R-L)*sqrt(N)), where N is the number, and L and R are the given range.
Auxiliary Space: O(1)
Approach 3:
An alternative approach to implement the same code would be to use a sieve algorithm. A sieve algorithm starts by creating a list of all the numbers in the desired range and then crossing out the multiples of each prime number. The resulting list will contain only the prime numbers.
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> bool * prime;
void sieve( int x, int y)
{ prime = calloc ((y + 1), sizeof ( bool ));
for ( int i = 2; i <= y; i++) {
prime[i] = true ;
}
for ( int i = 2; i * i <= y; i++) {
if (prime[i])
for ( int j = i * i; j <= y; j += i) {
prime[j] = false ;
}
}
} int * allPrime( int l, int r, int * size)
{ int count = 0;
for ( int i = l; i <= r; i++) {
if (prime[i]) {
count++;
}
}
int * result = malloc (count * sizeof ( int ));
int j = 0;
for ( int i = l; i <= r; i++) {
if (prime[i]) {
result[j++] = i;
}
}
*size = count;
return result;
} int main()
{ int starting_range = 5;
int ending_range = 100;
sieve(starting_range, ending_range);
int size;
int * result
= allPrime(starting_range, ending_range, &size);
if (size == 0) {
printf ( "There are no prime numbers in this range\n" );
}
else {
printf ( "The prime numbers in this range are: " );
for ( int i = 0; i < size; i++) {
printf ( "%d " , result[i]);
}
printf ( "\n" );
}
free (prime);
free (result);
return 0;
} |
#include <bits/stdc++.h> using namespace std;
vector< bool > prime;
void sieve( int x, int y)
{ prime.resize(y + 1, true );
prime[1] = false ;
for ( int i = 2; i * i <= y; i++) {
if (prime[i])
for ( int j = i * i; j <= y; j += i) {
prime[j] = false ;
}
}
} vector< int > allPrime( int l, int r)
{ vector< int > result;
for ( int i = l; i <= r; i++) {
if (prime[i]) {
result.push_back(i);
}
}
return result;
} int main()
{ int starting_range = 5;
int ending_range = 100;
sieve(starting_range, ending_range);
vector< int > result
= allPrime(starting_range, ending_range);
if (result.empty()) {
cout << "There are no prime numbers in this range"
<< endl;
}
else {
cout << "The prime numbers in this range are: " ;
for ( int n : result) {
cout << n << " " ;
}
cout << endl;
}
return 0;
} |
The prime numbers in this range are: 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Time Complexity : O(n log(log(n))
Auxiliary Space: (R-l), where R and l are the starting and ending ranges.