哥德巴赫猜想Java實現並優化
阿新 • • 發佈:2018-12-13
哥德巴赫猜想
驗證哥德巴赫猜想:任何一個大於 6 的偶數,都能分解成兩個質數的和。要求輸入一個整數,輸出這個 數能被分解成哪兩個質數的和。 eg : 14 14=3+11 14=7+7 public class TestGoldbach{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int n = s.nextInt(); //輸入大於 6 的偶數 while (n<6 || n%2!=0) { System.out.println("Error!"); n = s.nextInt(); } for(int a = 3 ; a <= n/2 ; a+=2){ int b = n-a; if (isPrime(a) && isPrime(b)){ System.out.println(n+"="+a+"+"+b); } } } //判斷m是不是質數 static boolean isPrime(int m){ double d = Math.sqrt(m); for(int i =3 ; i <= d ; i+=2){ if (m % i == 0) return false; } return true; } } //判斷一個數是質數 優化前: static boolean isPrime(int n){ for (int j = 2; j <= n; j++) { if (n % j == 0) return false; } return true; } 優化1: 在哥德巴赫猜想中,一個數的因子是成對出現的,如: 100 = 2 * 50 = 4 * 25 = 5 * 20 = 10 * 10 所以,一個數n,它的的因子,一個肯定是<=根號下n,一個肯定是>=根號下n 所以,不用找>=根號下n的因子,只有有<=根號下n的因子,就點有>=根號下n的因子 所以,搜尋範圍就到根號下n即可 static boolean isPrime(int n){ for (int j = 2; j <= Math.sqrt(n); j++) { if (n % j == 0) return false; } return true; } 再優化: //判斷m是不是質數 static boolean isPrime(int m){ double d = Math.sqrt(m); //從i=3開始,每次i+=2,即是隻找奇數就行,因為大於0的偶數都不是質數 //此題中,是判斷一個數可以拆分成某兩個數,看拆分後的數是不是質數 for(int i =3 ; i <= d ; i+=2){ if (m % i == 0) return false; } return true; }