java實現迴文質數
阿新 • • 發佈:2019-02-02
題目描述
因為151既是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 是迴文質數。
寫一個程式來找出範圍[a,b](5 <= a < b <= 100,000,00)( 一千萬)間的所有迴文質數;
輸入輸出格式
輸入格式:
第 1 行: 二個整數 a 和 b .
輸出格式:
因為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操作。