求出大于或等于 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
。
个人不通过答案(超时)
class Solution {
public:
bool sus(int n)
{
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0) return false;
if (n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6)
if (n % i == 0 || n % (i + 2) == 0) return false;
return true;
}
bool huiwen(int n)
{
int tmp = 0, n2 = n;
if(n < 10) return true;
while(n)
{
tmp = tmp * 10 + n % 10;
n /= 10;
}
if (n2 == tmp)
return true;
return false;
}
int primePalindrome(int N) {
for(int i = N; ;i++)
{
if(sus(i))
if(huiwen(i))
return i;
}
}
};
一开始看到这个题目感到非常简单,怎么会是M难度呢?于是就写 然后就超时了。(PS:质数的函数也是抄的 感觉sqrt太慢因为本来就超时了,但是并没有什么卵用)放到VS里面算这个超时的数9989900算了40秒才出来!(i7-6700HQ)然后不懂优化,遂放弃。
然后这是正解(排行榜第二位)
class Solution {
public:
int primePalindrome(int N) {
if (N < 100)
{
for (int i = N; ; ++i)
{
if (IsPrime(i) == true)
{
vector<int> vec;
GetDigits(i, vec);
if (IsPalin(vec) == true) return i;
}
}
}
else
{
for (int i = N; ; ++i)
{
if (IsPrime(i) == true)
{
vector<int> vec;
GetDigits(i, vec);
if (vec.size() % 2 == 0)
{
i = pow(10, vec.size());
continue;
}
if (IsPalin(vec) == true) return i;
}
}
}
}
bool IsPalin(vector<int>& vec)
{
if (vec.size() == 1) return true;
int i = 0;
int j = vec.size() - 1;
while (i < j)
{
if (vec[i] != vec[j]) return false;
++i;
--j;
}
return true;
}
void GetDigits(int n, vector<int>& vec)
{
while (n > 0)
{
vec.push_back(n % 10);
n = n / 10;
}
}
int IsPrime(int n)
{
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0) return false;
if (n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6)
if (n % i == 0 || n % (i + 2) == 0) return false;
return true;
}
};
用数组判断回文,然后在大数模式下偶数长度下遇到质数就添一位(数学不好不懂意思。。)
追记:偶长度除了11不存在回文素数