解法需要注意的两点:
-
判断是否是素数,和判断是否是回文,这有很多种方法,这里附上判断素数的一篇博客的连接,那里写的比较详细,大家可以按照需求使用求素数常用的几种方法
-
如果使用暴力解法,肯定会超时,超时的原因一定时循环次数过多,这里有一个理论:如果是一个长度是偶数,或者其本身是偶数的数,肯定不是素数(如果大家知道证明方法希望可以告知);按照这个理论构建我们自己的for循环;
-
!!!!!!!!!!切记,for循环里一定不能有i+=2;之类的操作;因为数越大,循环次数越多,这是指数爆炸一样的耗时
class Solution {
public:
int primePalindrome(int N)
{
if (N <=2)
return 2;
if (N % 2 == 0)
N++;
for (int i = N; ; )
{
string s = to_string(i);
if (s.length() % 2 == 0 && s != "11")
{
i = pow(10, s.length()) + 1;
}
else
{
if (judge_prime(i))
{
if (judge_palindrome(i))
{
return i;
}
}
i += 2;
}
}
return 0;
}
bool judge_prime(int n)
{
for (int i = 2; i <= sqrt(n); i++)
{
if (n%i == 0)
{
return false;
}
}
return true;
}
bool judge_palindrome(int i)
{
string s = to_string(i);
int first = 0, end = s.length() - 1;
while (first <= end)
{
if (s[first] != s[end])
{
return false;
}
first++;
end--;
}
return true;
}
};