求出大于或等于 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:先判断是不是回文数字,再判断是不是素数。注意,当数字的位数是偶数时(位数>=4),不存在回文素数。因为例如1111,1221等都是11的倍数,所以都不是素数。
所以为了加快运行速度,可以跳过偶数位数的情况。具体的C++代码如下所示:
class Solution {
public:
int primePalindrome(int N)
{
if(N==1)
return 2;
if(N<=3)
return N;
while(true)
{
if(judge(N)==N)
{
for(int j=2;j<=sqrt(N);++j) // 判断是不是素数
{
int k = sqrt(N);
if(N%j==0)
{
break;
}
if(j==k)
{
return N;
}
}
}
N++;
if(1000<N && N<10000) // 跳过不必要的部分
N=10000;
if(100000<N && N<1000000)
N = 1000000;
if(10000000<N && N<100000000)
N = 100000000;
}
return N;
}
int judge(int N) // 判断是不是回文数字
{
int ans = 0;
while(N>0)
{
ans = ans * 10 + N % 10;
N /= 10;
}
return ans;
}
};