题目描述:
求出大于或等于 N 的最小回文素数。
回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。
例如,12321 是回文数。
示例 1:
输入:6
输出:7
示例 2:
输入:8
输出:11
示例 3:
输入:13
输出:101
提示:
1 <= N <= 10^8
答案肯定存在,且小于 2 * 10^8。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/prime-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
emm看了题解才知道有技巧,就是大于11的所有偶数长度的数字(转成字符串看长度)总是能够被11整除,因此我们可以利用这个来扩大步长
比如当前是1000那么下一个就是 10^4 + 1,就是5位数,注意一定是 10 ^ len + 1不是10 ^ (len + 1)
class Solution {
//回文素数问题
public int primePalindrome(int N) {
if(N == 1 || N == 2){
return 2;
}
for (int i = N; i < Integer.MAX_VALUE; i++) {
if(isxuan(i) && is(i)){
return i;
}
int len =(i + "").length();
if(i > 11 && (len & 1) == 0){
i = (int)(Math.pow(10, len));
}
}
return 0;
}
public boolean isxuan(int num){
String s = String.valueOf(num);
if(s.length() == 1){
return true;
}
int start = 0;
int end = s.length() - 1;
while (start < end){
if(s.charAt(start) != s.charAt(end)){
return false;
}
start ++;
end --;
}
return true;
}
public boolean is(int num){
int t = (int) Math.sqrt(num);
for (int i = 2; i <= t; i++) {
if(num % i == 0){
return false;
}
}
return true;
}
}