
Given two numbers a and b as interval range, the task is to find the prime numbers in between this interval.
Examples:
Input : a = 1, b = 10
Output : 2, 3, 5, 7
Input : a = 10, b = 20
Output : 11, 13, 17, 19
In the below program, the range of numbers is taken as input and stored in the variables ‘a’ and ‘b’. Then using a for-loop, the numbers between the interval of a and b are traversed. For each number in the for loop, it is checked if this number is prime or not. If found prime, print the number. Then the next number in the loop is checked, till all numbers are checked.
Program:
C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, i, j, flag;
cout << "Enter lower bound of the interval: " ;
cin >> a;
cout << "\nEnter upper bound of the interval: " ;
cin >> b;
cout << "\nPrime numbers between "
<< a << " and " << b << " are: " ;
for (i = a; i <= b; i++) {
if (i == 1 || i == 0)
continue ;
flag = 1;
for (j = 2; j <= i / 2; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
if (flag == 1)
cout << i << " " ;
}
return 0;
}
|
C
#include <stdio.h>
int main()
{
int a, b, i, j, flag;
printf ( "Enter lower bound of the interval: " );
scanf ( "%d" , &a);
printf ( "\nEnter upper bound of the interval: " );
scanf ( "%d" , &b);
printf ( "\nPrime numbers between %d and %d are: " , a, b);
for (i = a; i <= b; i++) {
if (i == 1 || i == 0)
continue ;
flag = 1;
for (j = 2; j <= i / 2; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
if (flag == 1)
printf ( "%d " , i);
}
return 0;
}
|
Java
import java.util.Scanner;
public class GFG {
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int a, b, i, j, flag;
System.out.printf( "Enter lower bound of the interval: " );
a = sc.nextInt();
System.out.printf( "\nEnter upper bound of the interval: " );
b = sc.nextInt();
System.out.printf( "\nPrime numbers between %d and %d are: " , a, b);
for (i = a; i <= b; i++) {
if (i == 1 || i == 0 )
continue ;
flag = 1 ;
for (j = 2 ; j <= i / 2 ; ++j) {
if (i % j == 0 ) {
flag = 0 ;
break ;
}
}
if (flag == 1 )
System.out.println(i);
}
}
}
|
Python3
if __name__ = = '__main__' :
a, b, i, j, flag = 0 , 0 , 0 , 0 , 0
print ( "Enter lower bound of the interval:" ,
end = "")
a = int ( input ())
print (a)
print ( "Enter upper bound of the interval:" ,
end = "")
b = int ( input ())
print (b)
print ( "Prime numbers between" , a, "and" ,
b, "are:" , end = "")
for i in range (a, b + 1 ):
if (i = = 1 ):
continue
flag = 1
for j in range ( 2 , i / / 2 + 1 ):
if (i % j = = 0 ):
flag = 0
break
if (flag = = 1 ):
print (i, end = " " )
|
C#
using System;
class GFG{
public static void Main( string [] args)
{
int a, b, i, j, flag;
Console.WriteLine( "Enter lower bound of " +
"the interval: " );
a = int .Parse(Console.ReadLine());
Console.WriteLine( "\nEnter upper bound " +
"of the interval: " );
b = int .Parse(Console.ReadLine());
Console.WriteLine( "\nPrime numbers between " +
"{0} and {1} are: " , a, b);
for (i = a; i <= b; i++)
{
if (i == 1 || i == 0)
continue ;
flag = 1;
for (j = 2; j <= i / 2; ++j)
{
if (i % j == 0)
{
flag = 0;
break ;
}
}
if (flag == 1)
Console.WriteLine(i);
}
}
}
|
Javascript
<script>
let a, b, i, j, flag;
a = window.prompt( "Enter lower bound of the interval: " );
b = window.prompt( "Enter upper bound of the interval: " );
console.log( "Prime numbers between " + a + " and " + b << " are: " );
for (i = a; i <= b; i++) {
if (i == 1 || i == 0)
continue ;
flag = 1;
for (j = 2; j <= i / 2; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
if (flag == 1)
document.write(i, " " );
}
</script>
|
Output:
Enter lower bound of the interval: 1
Enter upper bound of the interval: 10
Prime numbers between 1 and 10 are: 2 3 5 7
Time Complexity: O(N2), Where N is the difference between the range
Auxiliary Space: O(1)
Optimized Solution :
The idea is to use the fact that even numbers (except 2) are not primes.
C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, i, j;
cout << "Enter lower bound of the interval: " ;
cin >> a;
cout << "\nEnter upper bound of the interval: " ;
cin >> b;
cout << "\nPrime numbers between " << a << " and " << b
<< " are: " ;
if (a <= 2) {
a = 2;
if (b >= 2) {
cout << a << " " ;
a++;
}
}
if (a % 2 == 0)
a++;
for (i = a; i <= b; i = i + 2) {
bool flag = 1;
for (j = 2; j * j <= i; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
if (flag == 1){
if (i==1)
continue ;
else
cout << i << " " ;
}
}
return 0;
}
|
Java
import java.util.*;
public class PrimeNumbersInRange {
public static boolean isPrime( int n) {
if (n == 0 || n == 1 ) {
return false ;
}
if (n == 2 ) {
return true ;
}
for ( int i = 2 ; i * i <= n; i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print( "Enter lower bound of the interval: " );
int lower = sc.nextInt();
System.out.print( "\nEnter upper bound of the interval: " );
int upper = sc.nextInt();
System.out.printf( "\nPrime numbers between %d and %d are: " , lower, upper);
for ( int i = lower; i <= upper; i++) {
if (isPrime(i)) {
System.out.print(i + " " );
}
}
sc.close();
}
}
|
Python3
if __name__ = = '__main__' :
a, b, i, j = 0 , 0 , 0 , 0
print ( "Enter lower bound of the interval:" ,end = "")
a = int ( input ())
print (a)
print ( "Enter upper bound of the interval:" ,end = "")
b = int ( input ())
print (b)
print ( "Prime numbers between" , a, "and" ,b, "are:" , end = "")
if (a = = 1 ):
print (a,end = " " )
a + = 1
if (b > = 2 ):
print (a,end = " " )
a + = 1
if (a = = 2 ):
print (a,end = " " )
if (a % 2 = = 0 ):
a + = 1
for i in range (a,b + 1 , 2 ):
flag = 1
j = 2
while (j * j < = i):
if (i % j = = 0 ):
flag = 0
break
j + = 1
if (flag = = 1 ):
print (i,end = " " )
|
C#
using System;
class GFG
{
static public void Main()
{
int a, b, i, j, flag;
Console.Write(
"Enter lower bound of the interval: " );
a = Convert.ToInt32(
Console.ReadLine());
Console.Write(
"\nEnter upper bound of the interval: " );
b = Convert.ToInt32(
Console.ReadLine());
Console.Write( "\nPrime numbers between " + a
+ " and " + b + " are: " );
if (a == 1)
{
Console.Write(a + " " );
a++;
if (b >= 2)
{
Console.Write(a + " " );
a++;
}
}
if (a == 2)
{
Console.Write(a + " " );
}
if (a % 2 == 0)
{
a++;
}
for (i = a; i <= b; i = i + 2)
{
flag = 1;
for (j = 2; j * j <= i; ++j)
{
if (i % j == 0)
{
flag = 0;
break ;
}
}
if (flag == 1)
{
Console.Write(i + " " );
}
}
}
}
|
Javascript
<script>
let a, b, i, j;
a = window.prompt( "Enter lower bound of the interval: " );
b = window.prompt( "Enter upper bound of the interval: " );
console.log( "Prime numbers between " + a + " and " + b << " are: " );
if (a <= 2)
{
a = 2;
if (b >= 2)
{
document.write(a, " " );
a++;
}
}
if (a % 2 == 0)
a++;
for (i = a; i <= b; i = i + 2) {
let flag = 1;
for (j = 2; j * j <= i; ++j) {
if (i % j == 0) {
flag = 0;
break ;
}
}
if (flag == 1){
if (i == 1) continue ;
else
document.write(i, " " );
}
}
</script>
|
Output:
Enter lower bound of the interval: 1
Enter upper bound of the interval: 10
Prime numbers between 1 and 10 are: 2 3 5 7
Time Complexity: O(N*sqrt(N)), Where N is the difference between the range
Auxiliary Space: O(1)
Sieve of Eratosthenes Method:
The sieve of Eratosthenes is one of the most efficient ways to find all primes smaller than N when N is smaller than 10 million or so.
Steps:
- Create a boolean array prime[srt to n] and initialize all its entries as true.
- Mark prime[0] and prime[1] as false because they are not prime numbers.
- Starting from p = srt, for each prime number p less than or equal to the square root of n, mark all multiples of p greater than or equal to p*p as composite by setting prime[i] to false.
- Finally, print all prime numbers between srt and n.
Below is the implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes( int srt, int n)
{
bool prime[n + 2];
memset (prime, true , sizeof (prime));
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
for ( int p = srt; p <= n; p++)
if (prime[p])
cout << p << " " ;
}
int main()
{
int srt = 1;
int end = 10;
SieveOfEratosthenes(srt, end);
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static void SieveOfEratosthenes( int srt, int n)
{
boolean [] prime = new boolean [n + 2 ];
Arrays.fill(prime, true );
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= n; i += p) {
prime[i] = false ;
}
}
}
for ( int p = srt; p <= n; p++) {
if (prime[p]) {
System.out.print(p + " " );
}
}
}
public static void main(String[] args)
{
int srt = 1 ;
int end = 10 ;
SieveOfEratosthenes(srt, end);
}
}
|
Python3
import math
def SieveOfEratosthenes(srt, n):
prime = [ True for i in range (n + 2 )]
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( 2 , int (math.sqrt(n)) + 1 ):
if prime[p] = = True :
for i in range (p * p, n + 1 , p):
prime[i] = False
for p in range (srt, n + 1 ):
if prime[p]:
print (p, end = " " )
if __name__ = = "__main__" :
srt = 1
end = 10
SieveOfEratosthenes(srt, end)
|
C#
using System;
public class GFG
{
public static void SieveOfEratosthenes( int srt, int n)
{
bool [] prime = new bool [n + 2];
Array.Fill(prime, true );
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= n; i += p)
{
prime[i] = false ;
}
}
}
for ( int p = srt; p <= n; p++)
{
if (prime[p])
{
Console.Write(p + " " );
}
}
}
public static void Main( string [] args)
{
int srt = 1;
int end = 10;
SieveOfEratosthenes(srt, end);
}
}
|
Javascript
function SieveOfEratosthenes(srt, n) {
let prime = new Array(n + 2 ).fill( true );
prime[0] = false ;
prime[1] = false ;
for (let p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for (let i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
for (let p = srt; p <= n; p++)
if (prime[p])
console.log(p + " " );
}
let srt = 1;
let end = 10;
SieveOfEratosthenes(srt, end);
|
Time Complexity:
The time complexity of the Sieve of Eratosthenes algorithm is O(n*log(log(n))) as it iterates over all numbers from 2 to n and removes all the multiples of each prime number.
In this code, the algorithm is applied only to a range [srt, n], which reduces the time complexity to O((n-srt+1)*log(log(n))) for the range [srt, n]. The loop for marking the multiples of each prime number iterates from p*p to n, which takes O((n-srt+1)*log(log(n))) time. Therefore, the overall time complexity of this code is O((n-srt+1)*log(log(n))).
Auxiliary Space:
The space complexity of the algorithm is O(n), which is the size of the boolean array prime. However, the size of the array is reduced to n+2-srt, which is the size of the array required for the given range [srt, n]. Therefore, the auxiliary space complexity of the code is O(n-srt+1).