回文素数(Failed)

求出大于或等于 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不存在回文素数






猜你喜欢

转载自blog.csdn.net/qq_34772658/article/details/81028941