1. 程式人生 > >java實現迴文質數

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操作。