leetcode 866. 回文质数
想着开大数组,用质数筛选的方法。但是开大数组超内存了🤡
class Solution {
public:
bool isPrime[200000001];
bool isPalind(int &num){
string str = to_string(num);
int i = 0,j = str.size()-1;
while(i < j){
if(str[i] != str[j]) return false;
++i;--j;
}
return true;
}
int primePalindrome(int n) {
if(n == 1) return 2;
for(int i = 2;i <= 200000000;++i){
if(isPrime[i] == true){
if(i >= n && isPalind(i) == true) return i;
for(int j = 2*i;j <= 200000000;j+=i){
isPrime[j] = false;
}
}
}
return -1;
}
};
题解:不断制造回文数进行判断
class Solution {
public:
//一个事实:如果一个回文数的长度为偶数,那么它必定可以被11整除,即它必定不是质数
bool isPrime(int &num){
if(num <= 5) return num == 2 || num == 3 || num == 5;
for(int i = 2;i*i <= num;++i){
if(num % i == 0) return false;
}
return true;
}
int getNextPalind(int &n){
string s = to_string(n);
int size = s.size(),mid = size/2;
while(1){
// 制造回文数:把前半段翻转一下复制到后半段
for(int i = 0;i < mid;++i) s[size-1-i] = s[i];
int temp = stoi(s);
if(temp >= n) return temp;
else{//// 如果比n小,那前半段+1
int j = size % 2 == 1 ? mid : mid-1;
while(s[j] == '9') s[j--] = '0';
++s[j];
}
}
}
int primePalindrome(int n) {
if(n == 1) return 2;
while(1){
n = getNextPalind(n);
if(isPrime(n)) return n;
++n;
}
}
};