java实现回文质数

题目描述 
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。 
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,00)( 一千万)间的所有回文质数; 
输入输出格式 
输入格式: 
第 1 行: 二个整数 a 和 b . 
输出格式: 

输出一个回文质数的列表,一行一个。

今天闲来无事,看了一个判断回文质数的题目,就想着用java进行了实现。既然是判断是否是回文质数,那个该数字一定要即使回文又是质数。

在判断是否是回文时,百度和谷歌网上的代码大多数都是通过除10运算进行比较,这样非常消耗内存和性能,因此本文采用了将数字转化为字符串的方式,对字符串进行回文判断。这样可以节省大量的系统性能。代码如下:

private static boolean isPalindrome(int num) {
    String numString = num+"";
    int low = 0;
    int high = numString.length()-1;
    while (low < high){
        if (numString.charAt(low) != numString.charAt(high)){
            return false;
        }
        low++;
        high--;
    }
    return true;
}

在判断质数时,不在对偶数进行判断,这样可以节省一半的性能,代码如下:

private static boolean isPrimeNumber(int num) {
    if (num<2 || num %2 ==0){
        return false;
    }
    for (int i = 3; i < Math.sqrt(num); i+=2) {
        if (num %i == 0){
            return false;
        }
    }
    return true;
}

完整代码如下:

package com.example.lib100;

/**
 * Created by wangyajie on 18-2-28.
 */

public class myClass {

    public static void main(String [] args){
        long startTime = System.currentTimeMillis();
        for (int i = 2; i < 10000000; i++) {
            if (isPalindrome(i)){
                if (isPrimeNumber(i)){
                    System.out.print(i+" ");
                }
            }
        }
        System.out.println("AccountTime: "+(System.currentTimeMillis()-startTime));
    }

    private static boolean isPrimeNumber(int num) {
        if (num<2 || num %2 ==0){
            return false;
        }
        for (int i = 3; i < Math.sqrt(num); i+=2) {
            if (num %i == 0){
                return false;
            }
        }
        return true;
    }

    private static boolean isPalindrome(int num) {
        String numString = num+"";
        int low = 0;
        int high = numString.length()-1;
        while (low < high){
            if (numString.charAt(low) != numString.charAt(high)){
                return false;
            }
            low++;
            high--;
        }
        return true;
    }
}

总耗时333毫秒,本文在网上随便找了一个代码进行了比较,代码如下:

package com.example.lib100;

/**
 * Created by wangyajie on 18-2-28.
 */

public class PrimeNumber {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long startTime = System.currentTimeMillis();
        System.out.println(System.currentTimeMillis());
        for(int i = 2;i < 10000000;i++){
            if(isPrime(i)){
                if (isPalindrome(i)){
                    System.out.print(i + " ");
                }
            }
        }
        System.out.println("AccountTime: "+(System.currentTimeMillis()-startTime));

    }
    public static boolean isPrime(int num) { //判断是否为素数
        for(int i = 2;i <= Math.sqrt(num);i++)
            if(num % i == 0)
                return false;
        return true;
    }

    static int reversal(int num) {  //反转原数
        int result = 0;
        while(num != 0){
            int lastDigit = num % 10;
            result = result * 10+ lastDigit;
            num = num / 10;
        }
        return result;
    }

    static boolean isPalindrome(int num) {  //判断是否为回文数
        return num == reversal(num);
    }

}

总耗时5423毫秒

因此通过耗时比较,将整形数据转化为字符串明显由于对除10操作。


你可能感兴趣的:(java实现回文质数)