266、回文素数

题目描述:
求出大于或等于 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

emm看了题解才知道有技巧,就是大于11的所有偶数长度的数字(转成字符串看长度)总是能够被11整除,因此我们可以利用这个来扩大步长

比如当前是1000那么下一个就是 10^4 + 1,就是5位数,注意一定是 10 ^ len + 1不是10 ^ (len + 1)

class Solution {
       //回文素数问题
    public int primePalindrome(int N) {
        if(N == 1 || N == 2){
            return 2;
        }
        for (int i = N; i < Integer.MAX_VALUE; i++) {
            if(isxuan(i) && is(i)){
                return i;
            }
            int len =(i + "").length();
            if(i > 11 && (len & 1) == 0){
                i = (int)(Math.pow(10, len));
            }
        }
        return 0;

    }
        public boolean isxuan(int num){
        String s = String.valueOf(num);
        if(s.length() == 1){
            return true;
        }
        int start = 0;
        int end = s.length() - 1;
        while (start < end){
            if(s.charAt(start) != s.charAt(end)){
                return false;
            }
            start ++;
            end --;
        }
        return true;


    }

    public boolean is(int num){
      
        int t = (int) Math.sqrt(num);
        for (int i = 2; i <= t; i++) {
            if(num % i == 0){
                return false;
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值