Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/866.html

866. Prime Palindrome (Medium)

Find the smallest prime palindrome greater than or equal to N.

Recall that a number is prime if it's only divisors are 1 and itself, and it is greater than 1. 

For example, 2,3,5,7,11 and 13 are primes.

Recall that a number is a palindrome if it reads the same from left to right as it does from right to left. 

For example, 12321 is a palindrome.

 

Example 1:

Input: 6
Output: 7

Example 2:

Input: 8
Output: 11

Example 3:

Input: 13
Output: 101

 

Note:

  • 1 <= N <= 10^8
  • The answer is guaranteed to exist and be less than 2 * 10^8.

Related Topics:
Math

Solution 1.

  • class Solution {
        public int primePalindrome(int N) {
            int palindromeNum = nextPalindrome(N);
            while (!isPrime(palindromeNum))
                palindromeNum = nextPalindrome(palindromeNum + 1);
            return palindromeNum;
        }
    
        public int nextPalindrome(int num) {
            int length = String.valueOf(num).length();
            if (num + 1 == (int) Math.pow(10, length))
                return num + 2;
            int divisor = (int) Math.pow(10, length / 2);
            int headerNum = num / divisor;
            boolean even = length % 2 == 0;
            int palindromeNum = generatePalindrome(headerNum, even);
            if (palindromeNum < num)
                palindromeNum = generatePalindrome(headerNum + 1, even);
            return palindromeNum;
        }
    
        public int generatePalindrome(int num, boolean even) {
            StringBuffer sb1 = new StringBuffer(String.valueOf(num));
            StringBuffer sb2 = new StringBuffer(String.valueOf(num));
            sb2.reverse();
            if (!even)
                sb2.deleteCharAt(0);
            String palindromeStr = new StringBuffer(sb1.toString()).append(sb2.toString()).toString();
            return Integer.parseInt(palindromeStr);
        }
    
        public boolean isPrime(int num) {
            if (num == 1)
                return false;
            if (num == 2 || num == 3)
                return true;
            if (num % 2 == 0 || num % 3 == 0)
                return false;
            int sqrt = (int) Math.sqrt(num);
            for (int i = 5; i <= sqrt; i += 2) {
                if (num % i == 0)
                    return false;
            }
            return true;
        }
    }
    
    ############
    
    class Solution {
        public int primePalindrome(int n) {
            while (true) {
                if (reverse(n) == n && isPrime(n)) {
                    return n;
                }
                if (n > 10000000 && n < 100000000) {
                    n = 100000000;
                }
                ++n;
            }
        }
    
        private boolean isPrime(int x) {
            if (x < 2) {
                return false;
            }
            for (int v = 2; v * v <= x; ++v) {
                if (x % v == 0) {
                    return false;
                }
            }
            return true;
        }
    
        private int reverse(int x) {
            int res = 0;
            while (x != 0) {
                res = res * 10 + x % 10;
                x /= 10;
            }
            return res;
        }
    }
    
  • // OJ: https://leetcode.com/problems/prime-palindrome/
    // Time: O(N)
    // Space: O(logN)
    // Ref: https://leetcode.com/problems/prime-palindrome/solution/
    class Solution {
        int getPalindrome(int half, bool odd) {
            string s = to_string(half);
            for (int i = s.size() - 1 - odd; i >= 0; --i) s += s[i];
            return stoi(s);
        }
        bool isPrime(int n) {
            if (n < 2) return false;
            for (int d = 2; d * d <= n; ++d) {
                if (n % d == 0) return false;
            }
            return true;
        }
    public:
        int primePalindrome(int n) {
            for (int len = 1; len <= 5; ++len) {
                for (int root = pow(10, len - 1); root < pow(10, len); ++root) { // Enumerate odd-length palindromes
                    int pal = getPalindrome(root, true);
                    if (pal >= n && isPrime(pal)) return pal;
                }
                for (int root = pow(10, len - 1); root < pow(10, len); ++root) { // Enumerate even-length palindromes
                    int pal = getPalindrome(root, false);
                    if (pal >= n && isPrime(pal)) return pal;
                }
            }
            return -1;
        }
    };
    
  • class Solution:
        def primePalindrome(self, n: int) -> int:
            def is_prime(x):
                if x < 2:
                    return False
                v = 2
                while v * v <= x:
                    if x % v == 0:
                        return False
                    v += 1
                return True
    
            def reverse(x):
                res = 0
                while x:
                    res = res * 10 + x % 10
                    x //= 10
                return res
    
            while 1:
                if reverse(n) == n and is_prime(n):
                    return n
                if 10**7 < n < 10**8:
                    n = 10**8
                n += 1
    
    
    
  • func primePalindrome(n int) int {
    	isPrime := func(x int) bool {
    		if x < 2 {
    			return false
    		}
    		for v := 2; v*v <= x; v++ {
    			if x%v == 0 {
    				return false
    			}
    		}
    		return true
    	}
    
    	reverse := func(x int) int {
    		res := 0
    		for x != 0 {
    			res = res*10 + x%10
    			x /= 10
    		}
    		return res
    	}
    	for {
    		if reverse(n) == n && isPrime(n) {
    			return n
    		}
    		if n > 10000000 && n < 100000000 {
    			n = 100000000
    		}
    		n++
    	}
    }
    

All Problems

All Solutions