分析,这个题目本身不难,用数学方法很容易解出来,问题是当给的数据过大时,容易超时。
数学法:遍历所有数字,检查是不是回文串。如果是,检查是不是素数,如果当前数字长度为 8,可以跳过检查,因为不存在 8 长度的素数。
class Solution {public int primePalindrome(int N) {while(true){if(isPalindrome(N) && isPrime(N))return N;N++;if (10_000_000 < N && N < 100_000_000)//跳过长度为8的数字,不加这个判断数字太大易超时N = 100_000_000;}}public boolean isPalindrome(int N){if(N<0) {return false;}else if(N==0){return true;}else if(N%10==0){return false;}//下面是N>0且不为10的整数倍的情况int M = 0;int temp = N;while(temp!=0){M=M*10+temp%10;temp=temp/10;}return M==N;}public boolean isPrime(int N) {if (N < 2) return false;int R = (int) Math.sqrt(N);for (int d = 2; d <= R; ++d)if (N % d == 0)return false;return true;}
}
用于自行调试的.java文件
class primePalindrome866 {public static void main(String[] args) {int num = 9989900;System.out.println(primePalindrome(num));}public static int primePalindrome(int N) {while(true){if(isPalindrome(N) && isPrime(N))return N;N++;if (10_000_000 < N && N < 100_000_000)N = 100_000_000;}}public static boolean isPalindrome(int N){if(N==0){return true;}else if(N%10==0){return false;}//下面是N>0且不为10的整数倍的情况int M = 0;int temp = N;while(temp!=0){M=M*10+temp%10;temp=temp/10;}return M==N;}public static boolean isPrime(int N) {if (N < 2) return false;int R = (int) Math.sqrt(N);for (int d = 2; d <= R; ++d)if (N % d == 0)return false;return true;}
}