判断一个数是不是回文质数

      在博文《P5 判断一个数是不是质数》中,给出了校验一个自然数是否为质数的方法,本文探究如何进一步校验一个自然数是否为回文质数。

      本文和散列表除了都要应用校验一个整数是不是素数之外,几乎毫无关联性,感兴趣或者需要的童鞋请继续阅读。

基本概念

      设n是一任意自然数,若将n的各位数字反向排列所得自然数n1与n相等,则称n为回文数(palindrome number)。例如:6660666。如果一个数字既是素数又是回文数,就称这个数是回文素数。

      问题:兹给定一个闭区间[begin, end],求这个区间内有多少个回文素数。 

算法实现

       首先,请求《P5判断一个数是不是质数》中校验一个自然是是否为素数的方法,校验自然数,如果是质数,则继续校验是否为回文数。这里采用函数boolean isPrime6(int num)校验是否为质数:

复制代码
    /**
     * 以6为步长,校验一个数字是否为质数
     * @param num
     * @return true is a prime number
     */
    public static boolean isPrime6(int num) {
        if (num <= 3) {
            return num > 1;
        }
        // 不在6的倍数两侧的一定不是质数
        if (num % 6 != 1 && num % 6 != 5) {
            return false;
        }
        int sqrt = 1 + (int) Math.sqrt(num);
        //在6的倍数两侧的也可能不是质数
        for (int i = 5; i < sqrt; i += 6) {
            if (num % i == 0 || num % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
复制代码

      然后,通过对质数取余和取商,借助字符串逐位拼接的方式,获取逆序字符串。最后,判断两个字符串的值是否相等,如果相等,则此数就是回文素数。

      完整的实现如下:

复制代码
   public static void main(String[] args) {
        int begin = 0, end = 101300;
        int ppNum = 0;
        for (;begin <= end; begin ++) {
            if (isPalindromePrimeNumber(begin)) {
                ppNum ++;
            }
        }
        System.out.println("闭区间内的回文质数个数是 " + ppNum);
     }
    /**
     * 判断是不是回文质数,支持把int类型改为long类型
     *  true 是
     * @param num
     */
    private static boolean isPalindromePrimeNumber(int num) {
        if (isPrime6(num)) {
            if (isPalindromeNumber(num)) {
                System.out.println("如下数字是回文素数:" + num);
                return true;
            }
        }
        // System.out.println("如下数字并非回文素数:" + num);
        return false;
    }
    /**
     * 判断是不是回文数
     *
     * @param num
     */
    private static boolean isPalindromeNumber(int num) {
        if (num < 10) {
            return true;
        }
        int temp = num;
        StringBuilder sb = new StringBuilder();
        while (temp > 0) {
            sb.append(temp % 10);
            temp = temp / 10;
        }

        if (Integer.parseInt(sb.toString()) == num) {
            return true;
        }
        return false;
    }
复制代码

 

Reference

https://www.pianshen.com/article/5408325739/ 

 

 

posted @   楼兰胡杨  阅读(520)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示