Emirp Number

medium Number Problems

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

Best approachTime O(sqrt(n))Space O(1)

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.

Same code works in Java810172125Basic features only, so nothing changes between versions.
/*
 * 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)
  1. Which two small problems does this problem combine?
  2. What is the reverse of 11?