Find the largest twins in given range
Given a range [low..high], print the largest twin numbers in given range (low and high inclusive). Two numbers are twins if they are primes and there difference is 2.
Examples:
Input: low = 10, high = 100
Output: Largest twins in given range: (71, 73)
Input: low = 1, high = 20
Output: Largest twins in given range: (17, 19)
A Simple Solution is to start from high and for every number x check if x and x – 2 are primes are not. Here x varies from high to low + 2.
An Efficient Solution is to use Sieve of Eratosthenes:
- Create a boolean array “prime[0..high]” and initialize all entries in it as true. A value in prime[i] will finally be false if i is not a prime number, else true.
- Run a loop from p = 2 to high.
- If prime[p] is true, then p is prime.
- Mark all multiples of p as not prime in prime[].
- Run a loop from high to low and print the first twins using prime[] built in step 2.
C++
#include <bits/stdc++.h>
using namespace std;
void printTwins( int low, int high)
{
bool prime[high + 1], twin = false ;
memset (prime, true , sizeof (prime));
prime[0] = prime[1] = false ;
for ( int p = 2; p <= floor ( sqrt (high)) + 1; p++) {
if (prime[p]) {
for ( int i = p * 2; i <= high; i += p)
prime[i] = false ;
}
}
for ( int i = high; i >= low; i--) {
if (prime[i] && (i - 2 >= low && prime[i - 2] == true )) {
cout << "Largest twins in given range: ("
<< i - 2 << ", " << i << ")" ;
twin = true ;
break ;
}
}
if (twin == false )
cout << "No such pair exists" << endl;
}
int main()
{
printTwins(10, 100);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static void printTwins( int low, int high)
{
boolean prime[] = new boolean [high + 1 ];
boolean twin = false ;
for ( int i = 0 ; i < high + 1 ; i++)
prime[i] = true ;
prime[ 0 ] = prime[ 1 ] = false ;
for ( int p = 2 ;
p <= Math.floor(Math.sqrt(high)) + 1 ; p++)
{
if (prime[p])
{
for ( int i = p * 2 ; i <= high; i += p)
prime[i] = false ;
}
}
for ( int i = high; i >= low; i--)
{
if (prime[i] && (i - 2 >= low &&
prime[i - 2 ] == true ))
{
System.out.println( "Largest twins in given range: (" +
(i - 2 ) + ", " + (i) + ")" );
twin = true ;
break ;
}
}
if (twin == false )
System.out.println( "No such pair exists" );
}
public static void main (String[] args)
{
printTwins( 10 , 100 );
}
}
|
Python3
from math import sqrt,floor
def printTwins(low, high):
prime = [ True for i in range (high + 1 )]
twin = False
prime[ 0 ] = False
prime[ 1 ] = False
k = floor(sqrt(high)) + 2
for p in range ( 2 , k, 1 ):
if (prime[p]):
for i in range (p * 2 , high + 1 , p):
prime[i] = False
i = high
while (i > = low):
if (prime[i] and (i - 2 > = low and
prime[i - 2 ] = = True )):
print ( "Largest twins in given range:(" , (i - 2 ),
"," , (i), ")" )
twin = True
break
i - = 1
if (twin = = False ):
print ( "No such pair exists" )
if __name__ = = '__main__' :
printTwins( 10 , 100 )
|
C#
class GFG
{
static void printTwins( int low, int high)
{
bool [] prime = new bool [high + 1];
bool twin = false ;
for ( int i = 0; i < high + 1; i++)
prime[i] = true ;
prime[0] = prime[1] = false ;
for ( int p = 2;
p <= System.Math.Floor(
System.Math.Sqrt(high)) + 1; p++)
{
if (prime[p])
{
for ( int i = p * 2; i <= high; i += p)
prime[i] = false ;
}
}
for ( int i = high; i >= low; i--)
{
if (prime[i] && (i - 2 >= low &&
prime[i - 2] == true ))
{
System.Console.WriteLine( "Largest twins in given range: (" +
(i - 2) + ", " + (i) + ")" );
twin = true ;
break ;
}
}
if (twin == false )
System.Console.WriteLine( "No such pair exists" );
}
public static void Main()
{
printTwins(10, 100);
}
}
|
Javascript
<script>
function printTwins(low, high)
{
let prime = new Array(high + 1);
let twin = false ;
for (let i = 0; i < high + 1; i++)
prime[i] = true ;
prime[0] = prime[1] = false ;
for (let p = 2; p <=
Math.floor(Math.sqrt(high)) + 1; p++)
{
if (prime[p])
{
for (let i = p * 2; i <= high; i += p)
prime[i] = false ;
}
}
for (let i = high; i >= low; i--)
{
if (prime[i] && (i - 2 >= low &&
prime[i - 2] == true ))
{
document.write(
"Largest twins in given range: (" +
(i - 2) + ", " + (i) + ")" + "</br>"
);
twin = true ;
break ;
}
}
if (twin == false )
document.write( "No such pair exists" );
}
printTwins(10, 100);
</script>
|
PHP
<?php
function printTwins( $low , $high )
{
$prime [ $high + 1]= array ();
$twin = false;
$prime = array_fill (0, ( $high + 1), true);
$prime [0] = $prime [1] = false;
for ( $p = 2; $p <= floor (sqrt( $high )) + 1; $p ++) {
if ( $prime [ $p ]) {
for ( $i = $p * 2; $i <= $high ; $i += $p )
$prime [ $i ] = false;
}
}
for ( $i = $high ; $i >= $low ; $i --) {
if ( $prime [ $i ] && ( $i - 2 >= $low && $prime [ $i - 2] == true)) {
echo "Largest twins in given range: (" ,
$i - 2 , ", " , $i , ")" ;
$twin = true;
break ;
}
}
if ( $twin == false)
echo "No such pair exists" ;
}
printTwins(10, 100);
#This code is contributed by ajit.
?>
|
Output
Largest twins in given range: (71, 73)
Time Complexity: O(high*log(log(high)))
Auxiliary Space: O(high)
Another Approach:
- Define a function is_prime that takes an integer as input and returns true if it is a prime number, false otherwise.
- Define a function find_largest_twins that takes the start and end of the range as input, and finds the largest twin primes within that range.
- In the find_largest_twins function, loop through the range from start to end, and check if each number and the number two greater than it are prime using the is_prime function.
- If a pair of twin primes is found, update the values of largest_prime and largest_twin_prime to the larger and smaller of the two primes, respectively.
- If no twin primes are found in the range, print a message saying so.
- If twin primes are found, print a message with the values of start, end, largest_twin_prime, and largest_prime.
- In the main function, set the values of start and end to the desired range, and call the find_largest_twins function with these values.
C++
#include <iostream>
using namespace std;
bool is_prime( int n)
{
if (n < 2) {
return false ;
}
for ( int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
void find_largest_twins( int start, int end)
{
int largest_prime = 0;
int largest_twin_prime = 0;
for ( int i = start; i <= end; i++) {
if (is_prime(i) && is_prime(i + 2)) {
largest_prime = i + 2;
largest_twin_prime = i;
}
}
if (largest_twin_prime == 0) {
cout << "No twin primes found in the given range\n" ;
}
else {
cout << "The largest twin primes in the range ["
<< start << "," << end << "]"
<< " are " << largest_twin_prime << " and "
<< largest_prime;
}
}
int main()
{
int start = 100;
int end = 1000;
find_largest_twins(start, end);
return 0;
}
|
C
#include <stdbool.h>
#include <stdio.h>
bool is_prime( int n)
{
if (n < 2) {
return false ;
}
for ( int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
void find_largest_twins( int start, int end)
{
int largest_prime = 0;
int largest_twin_prime = 0;
for ( int i = start; i <= end; i++) {
if (is_prime(i) && is_prime(i + 2)) {
largest_prime = i + 2;
largest_twin_prime = i;
}
}
if (largest_twin_prime == 0) {
printf ( "No twin primes found in the given range\n" );
}
else {
printf ( "The largest twin primes in the range [%d, "
"%d] are %d and %d\n" ,
start, end, largest_twin_prime,
largest_prime);
}
}
int main()
{
int start = 100;
int end = 1000;
find_largest_twins(start, end);
return 0;
}
|
Java
public class LargestTwinPrimes {
static boolean isPrime( int n) {
if (n < 2 ) {
return false ;
}
for ( int i = 2 ; i * i <= n; i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
static void findLargestTwins( int start, int end) {
int largestPrime = 0 ;
int largestTwinPrime = 0 ;
for ( int i = start; i <= end; i++) {
if (isPrime(i) && isPrime(i + 2 )) {
largestPrime = i + 2 ;
largestTwinPrime = i;
}
}
if (largestTwinPrime == 0 ) {
System.out.println( "No twin primes found in the given range" );
} else {
System.out.println( "The largest twin primes in the range [" + start + "," + end + "] are " +
largestTwinPrime + " and " + largestPrime);
}
}
public static void main(String[] args) {
int start = 100 ;
int end = 1000 ;
findLargestTwins(start, end);
}
}
|
Python3
def is_prime(n):
if n < 2 :
return False
for i in range ( 2 , int (n * * 0.5 ) + 1 ):
if n % i = = 0 :
return False
return True
def find_largest_twins(start, end):
largest_prime = 0
largest_twin_prime = 0
for i in range (start, end + 1 ):
if is_prime(i) and is_prime(i + 2 ):
largest_prime = i + 2
largest_twin_prime = i
if largest_twin_prime = = 0 :
print ( "No twin primes found in the given range" )
else :
print (
f "The largest twin primes in the range [{start},{end}] are {largest_twin_prime} and {largest_prime}" )
start = 100
end = 1000
find_largest_twins(start, end)
|
C#
using System;
class GFG
{
static bool IsPrime( int n)
{
if (n < 2)
{
return false ;
}
for ( int i = 2; i <= Math.Sqrt(n); i++)
{
if (n % i == 0)
{
return false ;
}
}
return true ;
}
static void FindLargestTwins( int start, int end)
{
int largestPrime = 0;
int largestTwinPrime = 0;
for ( int i = start; i <= end; i++)
{
if (IsPrime(i) && IsPrime(i + 2))
{
largestPrime = i + 2;
largestTwinPrime = i;
}
}
if (largestTwinPrime == 0)
{
Console.WriteLine( "No twin primes found in the given range" );
}
else
{
Console.WriteLine($ "The largest twin primes in the range [{start},{end}] are {largestTwinPrime} and {largestPrime}" );
}
}
static void Main()
{
int start = 100;
int end = 1000;
FindLargestTwins(start, end);
}
}
|
Javascript
function isPrime(n) {
if (n < 2) {
return false ;
}
for (let i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
function findLargestTwins(start, end) {
let largestPrime = 0;
let largestTwinPrime = 0;
for (let i = start; i <= end; i++) {
if (isPrime(i) && isPrime(i + 2)) {
largestPrime = i + 2;
largestTwinPrime = i;
}
}
if (largestTwinPrime == 0) {
console.log( "No twin primes found in the given range" );
} else {
console.log(
`The largest twin primes in the range [${start},${end}] are ${largestTwinPrime} and ${largestPrime}`
);
}
}
const start = 100;
const end = 1000;
findLargestTwins(start, end);
|
Output
The largest twin primes in the range [100, 1000] are 881 and 883
The time complexity of the is_prime function is O(sqrt(n)), and it is called for each number in the range from start to end. Therefore, the time complexity of the find_largest_twins function is O((end – start + 1) * sqrt(end)), which is roughly equivalent to O(n * sqrt(n)).
The Auxiliary space of the program is O(1) since it only uses a constant amount of memory regardless of the size of the input range.
Last Updated :
28 Nov, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...