Given an integer N, the task is to check if N is a Dihedral prime number or not. A Dihedral prime is a prime number that can be read as itself or as another prime number when read in a seven-segment display, regardless of different orientation and surface.
Examples:
Input: N = 108881
Output: YesInput: N = 789
Output: No
Approach: Pre-calculate prime number sieve for primality testing. The Sieves of Eratosthenes can be calculated in n*logn*logn time. Run a primality test for the number and its different orientations. If the number passes the primality tests, check if any digits belong to the exclusion set [3, 4, 6, 7, 9]. The return is true if the number passes both tests.
Below is the implementation of the above approach:
// C++ implementation of the above approach #include <bits/stdc++.h> using namespace std;
bool isPrime[ int (1e5) + 5];
// Function to return the reverse // of a number int reverse( int n)
{ int temp = n;
int sum = 0;
while (temp > 0) {
int rem = temp % 10;
sum = sum * 10 + rem;
temp /= 10;
}
return sum;
} // Function to generate mirror reflection // of a number int mirror( int n)
{ int temp = n;
int sum = 0;
while (temp > 0) {
int rem = temp % 10;
if (rem == 2)
rem = 5;
else if (rem == 5)
rem = 2;
sum = sum * 10 + rem;
temp /= 10;
}
return sum;
} // Function to initialize prime number sieve bool sieve()
{ memset (isPrime, true , sizeof isPrime);
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= int (1e5); i++) {
for ( int j = 2; i * j <= int (1e5); j++) {
isPrime[i * j] = false ;
}
}
} // Function that returns true if n is // Dihedral Prime number bool isDihedralPrime( int n)
{ // Check if the orientations of n
// is also prime
if (!isPrime[n]
|| !isPrime[mirror(n)]
|| !isPrime[reverse(n)]
|| !isPrime[reverse(mirror(n))])
return false ;
int temp = n;
while (temp > 0) {
int rem = temp % 10;
if (rem == 3 || rem == 4 || rem == 6
|| rem == 7 || rem == 9)
return false ;
temp /= 10;
}
return true ;
} // Driver code int main()
{ sieve();
int n = 18181;
if (isDihedralPrime(n))
cout << "Yes" ;
else
cout << "No" ;
return 0;
} |
// Java implementation of the above approach import java.util.*;
class GFG
{ static boolean [] isPrime = new boolean [( int ) (1e5) + 5 ];
// Function to return the reverse
// of a number
static int reverse( int n)
{
int temp = n;
int sum = 0 ;
while (temp > 0 )
{
int rem = temp % 10 ;
sum = sum * 10 + rem;
temp /= 10 ;
}
return sum;
}
// Function to generate mirror reflection
// of a number
static int mirror( int n)
{
int temp = n;
int sum = 0 ;
while (temp > 0 )
{
int rem = temp % 10 ;
if (rem == 2 )
{
rem = 5 ;
}
else if (rem == 5 )
{
rem = 2 ;
}
sum = sum * 10 + rem;
temp /= 10 ;
}
return sum;
}
// Function to initialize
// prime number sieve
static void sieve()
{
Arrays.fill(isPrime, true );
isPrime[ 0 ] = isPrime[ 1 ] = false ;
for ( int i = 2 ;
i <= ( int ) 1e5; i++)
{
for ( int j = 2 ;
i * j <= ( int ) 1e5; j++)
{
isPrime[i * j] = false ;
}
}
}
// Function that returns true if n is
// Dihedral Prime number
static boolean isDihedralPrime( int n)
{
// Check if the orientations of n
// is also prime
if (!isPrime[n] ||
!isPrime[mirror(n)] ||
!isPrime[reverse(n)] ||
!isPrime[reverse(mirror(n))])
{
return false ;
}
int temp = n;
while (temp > 0 )
{
int rem = temp % 10 ;
if (rem == 3 || rem == 4 ||
rem == 6 || rem == 7 ||
rem == 9 )
{
return false ;
}
temp /= 10 ;
}
return true ;
}
// Driver code
public static void main(String[] args)
{
sieve();
int n = 18181 ;
if (isDihedralPrime(n))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
}
} // This code is contributed by Rajput-Ji |
# Python implementation of the above approach isPrime = ( int ( 1e5 ) + 5 ) * [ True ]
# Function to return the reverse # of a number def reverse(n):
temp = n
sum = 0
while temp> 0 :
rem = temp % 10
sum = sum * 10 + rem
temp / / = 10
return sum
# Function to generate mirror reflection # of a number def mirror(n):
temp = n
sum = 0
while temp> 0 :
rem = temp % 10
if rem = = 2 :
rem = 5
elif rem = = 5 :
rem = 2
sum = sum * 10 + rem
temp / / = 10
return sum
# Function to initialize prime number sieve def sieve():
isPrime[ 0 ] = isPrime[ 1 ] = False
for i in range ( 2 , int ( 1e5 ) + 1 ):
j = 2
while i * j< = int ( 1e5 ):
isPrime[i * j] = False
j + = 1
# Function that returns true if n is # Dihedral Prime number def isDihedralPrime(n):
# Check if the orientations of n is also prime
if ( not isPrime[n]) or ( not isPrime[mirror(n)]) \
or ( not isPrime[reverse(n)]) \
or ( not isPrime[reverse(mirror(n))]):
return False
temp = n
while temp> 0 :
rem = temp % 10 ;
if rem = = 3 or rem = = 4 or \
rem = = 6 or rem = = 7 or rem = = 9 :
return False
temp / / = 10
return True
# Driver code if __name__ = = '__main__' :
sieve()
n = 18181
if isDihedralPrime(n):
print ( "Yes" )
else :
print ( "No" )
|
// C# implementation of the above approach using System;
class GFG
{ static Boolean[] isPrime = new Boolean[( int ) (1e5) + 5];
// Function to return the reverse
// of a number
static int reverse( int n)
{
int temp = n;
int sum = 0;
while (temp > 0)
{
int rem = temp % 10;
sum = sum * 10 + rem;
temp /= 10;
}
return sum;
}
// Function to generate mirror reflection
// of a number
static int mirror( int n)
{
int temp = n;
int sum = 0;
while (temp > 0)
{
int rem = temp % 10;
if (rem == 2)
{
rem = 5;
}
else if (rem == 5)
{
rem = 2;
}
sum = sum * 10 + rem;
temp /= 10;
}
return sum;
}
// Function to initialize
// prime number sieve
static void sieve()
{
for ( int k = 0; k < isPrime.Length; k++)
isPrime[k] = true ;
isPrime[0] = isPrime[1] = false ;
for ( int i = 2;
i <= ( int ) 1e5; i++)
{
for ( int j = 2;
i * j <= ( int ) 1e5; j++)
{
isPrime[i * j] = false ;
}
}
}
// Function that returns true if n is
// Dihedral Prime number
static Boolean isDihedralPrime( int n)
{
// Check if the orientations of n
// is also prime
if (!isPrime[n] ||
!isPrime[mirror(n)] ||
!isPrime[reverse(n)] ||
!isPrime[reverse(mirror(n))])
{
return false ;
}
int temp = n;
while (temp > 0)
{
int rem = temp % 10;
if (rem == 3 || rem == 4 ||
rem == 6 || rem == 7 ||
rem == 9)
{
return false ;
}
temp /= 10;
}
return true ;
}
// Driver code
public static void Main(String[] args)
{
sieve();
int n = 18181;
if (isDihedralPrime(n))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
} // This code is contributed by Rajput-Ji |
<?php // PHP implementation of the above approach $isPrime = array_fill (0, 25000 , true);
// Function to return the reverse // of a number function reverse( $n )
{ $temp = $n ;
$sum = 0;
while ( $temp > 0)
{
$rem = $temp % 10;
$sum = $sum * 10 + $rem ;
$temp = floor ( $temp / 10);
}
return $sum ;
} // Function to generate mirror reflection // of a number function mirror( $n )
{ $temp = $n ;
$sum = 0;
while ( $temp > 0)
{
$rem = $temp % 10;
if ( $rem == 2)
$rem = 5;
else if ( $rem == 5)
$rem = 2;
$sum = $sum * 10 + $rem ;
$temp = floor ( $temp / 10);
}
return $sum ;
} // Function to initialize prime number sieve function sieve()
{ $GLOBALS [ 'isPrime' ][0] = $GLOBALS [ 'isPrime' ][1] = false;
for ( $i = 2; $i <= floor (1e4); $i ++)
{
for ( $j = 2; $i * $j <= floor (1e4); $j ++)
{
$GLOBALS [ 'isPrime' ][ $i * $j ] = false;
}
}
} // Function that returns true if n is // Dihedral Prime number function isDihedralPrime( $n )
{ // Check if the orientations of n
// is also prime
if (! $GLOBALS [ 'isPrime' ][ $n ] ||
! $GLOBALS [ 'isPrime' ][mirror( $n )] ||
! $GLOBALS [ 'isPrime' ][reverse( $n )] ||
! $GLOBALS [ 'isPrime' ][reverse(mirror( $n ))])
return false;
$temp = $n ;
while ( $temp > 0)
{
$rem = $temp % 10;
if ( $rem == 3 || $rem == 4 ||
$rem == 6 || $rem == 7 || $rem == 9)
return false;
$temp = floor ( $temp / 10);
}
return true;
} // Driver code sieve(); $n = 18181;
if (isDihedralPrime( $n ))
echo "Yes" ;
else echo "No" ;
// This code is contributed by Ryuga ?> |
<script> // Javascript implementation of the above approach let isPrime = new Array(25000).fill( true );
// Function to return the reverse // of a number function reverse(n)
{ let temp = n;
let sum = 0;
while (temp > 0)
{
rem = temp % 10;
sum = sum * 10 + rem;
temp = Math.floor(temp / 10);
}
return sum;
} // Function to generate mirror reflection // of a number function mirror(n)
{ let temp = n;
let sum = 0;
while (temp > 0)
{
let rem = temp % 10;
if (rem == 2)
rem = 5;
else if (rem == 5)
rem = 2;
sum = sum * 10 + rem;
temp = Math.floor(temp / 10);
}
return sum;
} // Function to initialize prime number sieve function sieve()
{ isPrime[0] = isPrime[1] = false ;
for (let i = 2; i <= Math.floor(1e4); i++)
{
for (let j = 2; i * j <= Math.floor(1e4); j++)
{
isPrime[i * j] = false ;
}
}
} // Function that returns true if n is // Dihedral Prime number function isDihedralPrime(n)
{ // Check if the orientations of n
// is also prime
if (!isPrime[n] ||
!isPrime[mirror(n)] ||
!isPrime[reverse(n)] ||
!isPrime[reverse(mirror(n))])
return false ;
let temp = n;
while (temp > 0)
{
rem = temp % 10;
if (rem == 3 || rem == 4 ||
rem == 6 || rem == 7 || rem == 9)
return false ;
temp = Math.floor(temp / 10);
}
return true ;
} // Driver code sieve(); let n = 18181; if (isDihedralPrime(n))
document.write( "Yes" );
else document.write( "No" );
// This code is contributed by Saurabh Jaiswal </script> |
Yes
Time Complexity: O(n * log(log n))
Auxiliary Space: O(105)