1.タイトル
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(LeetCode)
リンク:https ://leetcode-cn.com/problems/prime-palindrome
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
2.問題解決
11を除いて、456654のような偶数桁のパリンドロームは素数ではなく、すべて11で割り切れます。
- このパスによると、タイムアウトを回避するためにいくつかの大きな数字をドロップします
class Solution {
public:
int primePalindrome(int N) {
if(N==1)
return 2;
if(8<=N && N<=11)
return 11;
int bit;
for(;N;++N)
{
if(10000000 < N && N < 100000000)
N = 100000000;//没有8位数的回文素数
if(isPalindrome(N,bit) && (bit%2) && isPrime(N))//奇数位的回文数才可能是质数,除11
return N;
}
return -1;
}
bool isPalindrome(int n, int &bit)
{
int t = 0, N = n;
bit = 0;
while(n)
{
t = t*10+n%10;
n /= 10;
bit++;
}
return (t==N);
}
bool isPrime(int n)
{
for(int i = 2; i <= sqrt(n); i++)
if(n%i==0)
return false;
return true;
}
};