Check whether N is a Dihedral Prime Number or not
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: Yes
Input: 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++
#include <bits/stdc++.h>
using namespace std;
bool isPrime[ int (1e5) + 5];
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;
}
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;
}
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 ;
}
}
}
bool isDihedralPrime( int n)
{
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 ;
}
int main()
{
sieve();
int n = 18181;
if (isDihedralPrime(n))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static boolean [] isPrime = new boolean [( int ) (1e5) + 5 ];
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;
}
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;
}
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 ;
}
}
}
static boolean isDihedralPrime( int n)
{
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 ;
}
public static void main(String[] args)
{
sieve();
int n = 18181 ;
if (isDihedralPrime(n))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
}
}
|
Python3
isPrime = ( int ( 1e5 ) + 5 ) * [ True ]
def reverse(n):
temp = n
sum = 0
while temp> 0 :
rem = temp % 10
sum = sum * 10 + rem
temp / / = 10
return sum
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
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
def isDihedralPrime(n):
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
if __name__ = = '__main__' :
sieve()
n = 18181
if isDihedralPrime(n):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static Boolean[] isPrime = new Boolean[( int ) (1e5) + 5];
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;
}
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;
}
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 ;
}
}
}
static Boolean isDihedralPrime( int n)
{
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 ;
}
public static void Main(String[] args)
{
sieve();
int n = 18181;
if (isDihedralPrime(n))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
PHP
<?php
$isPrime = array_fill (0, 25000 , true);
function reverse( $n )
{
$temp = $n ;
$sum = 0;
while ( $temp > 0)
{
$rem = $temp % 10;
$sum = $sum * 10 + $rem ;
$temp = floor ( $temp / 10);
}
return $sum ;
}
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 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 isDihedralPrime( $n )
{
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;
}
sieve();
$n = 18181;
if (isDihedralPrime( $n ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
let isPrime = new Array(25000).fill( true );
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 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 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 isDihedralPrime(n)
{
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 ;
}
sieve();
let n = 18181;
if (isDihedralPrime(n))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(n * log(log n))
Auxiliary Space: O(105)
Last Updated :
21 May, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...