回文素數


leetcode 866. Prime Palindrome

題目:https://leetcode.com/problems/prime-palindrome/

解法:https://leetcode.com/problems/prime-palindrome/discuss/158439/c%2B%2B-evenodd-length-palindrome-merge-sort-like-solution.-interviewer-really-loves-it-kiss

題目:給定一個數,輸出大於等於這個數的最小的回文素數。

涉及到兩個經典數學問題,求素數和求回文數。

判斷素數有很多算法,可以使用最簡單的遍歷,因為最好記。

    bool isPrime(int num){
        if (num < 2 || num % 2 == 0) return num == 2;
        for (int i = 3; i * i <= num; i+=2){
            if (num % i == 0) return false;
        }
        return true;
    }

判斷回文則可以用字符串,左子串與右子串是否相等。

另外可以采用先構造回文串,再判斷是否是素數的方法,減少遍歷的數字個數。

class Solution {
public:
    int primePalindrome(int N) {
        int evenSeed = 1;
        int oddSeed = 1;
        int cur = 0;
        while (cur < N || !isPrime(cur)){
            int evenp = genEvenPalin(evenSeed);
            int oddp = genOddPalin(oddSeed);
            cur = min(evenp, oddp);
            evenp > oddp ? ++oddSeed : ++evenSeed;
        }
        return cur;
    }
    
    int genEvenPalin(int seed){
        string half = to_string(seed);
        return stoi(half + string(half.rbegin(), half.rend()));
    }
    
    int genOddPalin(int seed){
        string half = to_string(seed);
        return stoi(half + string(half.rbegin() + 1, half.rend()));
    }
    
    bool isPrime(int num){
        if (num < 2 || num % 2 == 0) return num == 2;
        for (int i = 3; i * i <= num; i+=2){
            if (num % i == 0) return false;
        }
        return true;
    }
};

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM