Emirp Number
Problem
An emirp is a prime number whose reverse is a different prime number. Example: 13 is prime and its reverse 31 is also prime. A palindromic prime such as 11 is not an emirp. Read a positive integer and print true if it is an emirp, otherwise false.
Constraints
- 0 <= n <= 10^9
Examples
Input
13
Output
true
Input
11
Output
false
Solutions
We combine two earlier ideas: reverse a number and test a prime. The extra check removes palindromic primes because the reverse must be a different number.
/*
* Problem : Check if a number is an emirp.
* Input : One integer.
* Output : true or false.
* Approach: Check the number and its reverse with a prime test.
* Time : O(sqrt(n))
* Space : O(1)
* Java : 8 or newer.
*/
import java.util.Scanner;
public class Main {
// This method receives a number and returns true if it is a prime number.
static boolean isPrime(long value) {
if (value < 2) {
return false;
}
for (long divisor = 2; divisor * divisor <= value; divisor++) {
if (value % divisor == 0) {
return false;
}
}
return true;
}
// This method receives a number and returns true if the number is an emirp.
static boolean isEmirp(long number) {
// Step 1: An emirp must be a prime number first.
if (!isPrime(number)) {
return false;
}
// Step 2: Reverse the digits of the number. Example: 13 -> 31.
long remaining = number;
long reversed = 0;
while (remaining > 0) {
reversed = reversed * 10 + remaining % 10;
remaining = remaining / 10;
}
// Step 3: A palindromic prime (like 11 or 101) has the same reverse, so it is not an emirp.
if (reversed == number) {
return false;
}
// Step 4: The reversed number must be a prime number too.
return isPrime(reversed);
}
public static void main(String[] args) {
long number = new Scanner(System.in).nextLong();
System.out.println(isEmirp(number));
}
}
Hints (2)
- Which two small problems does this problem combine?
- What is the reverse of 11?