uacs2024

导航

leetcode 866. 回文质数

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;
        }     
    }
};

 

posted on 2024-12-14 16:00  ᶜʸᵃⁿ  阅读(12)  评论(0)    收藏  举报