leetcode —— 866. 回文素数

求出大于或等于 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)
链接:https://leetcode-cn.com/problems/prime-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

————————
解题思路:先判断是不是回文数字,再判断是不是素数。注意,当数字的位数是偶数时(位数>=4),不存在回文素数。因为例如1111,1221等都是11的倍数,所以都不是素数。

所以为了加快运行速度,可以跳过偶数位数的情况。具体的C++代码如下所示:

class Solution {
public:
    int primePalindrome(int N) 
    {
        if(N==1)
            return 2;
        if(N<=3)
            return N;
        while(true)
        {
            if(judge(N)==N)
            {
                for(int j=2;j<=sqrt(N);++j)  // 判断是不是素数
                {
                    int k = sqrt(N);
                    if(N%j==0)
                    {
                        break;
                    }
                    if(j==k)
                    {
                        return N;
                    }
                }
            }
            N++;
            if(1000<N && N<10000)  // 跳过不必要的部分
                N=10000;
            if(100000<N && N<1000000)
                N = 1000000;
            if(10000000<N && N<100000000)
                N = 100000000;
        }
        return N;
    }
    int judge(int N)  // 判断是不是回文数字
    {
        int ans = 0;
        while(N>0)
        {
            ans = ans * 10 + N % 10;
            N /= 10;
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值