原文地址已经不记得了,对代码做一些优化。当n较大时可以O(1)判断素数是一个可取的选择。

 
  
  1. /** 
  2.  * 哥德巴赫猜想大致可以分为两个猜想:  
  3.  * 1.每个不小于6的偶数都是两个奇素数之和; 
  4.  * 2.每个不小于9的奇数都是三个奇素数之和。 
  5.  *  
  6.  * @author yangwen 
  7.  * @modify eric 
  8.  */ 
  9. public class Guess { 
  10.  
  11.     public static void main(String args[]) { 
  12.          
  13.         long st = System.currentTimeMillis(); 
  14.          
  15.         int n = 100000
  16.          
  17.         boolean[] flag =new boolean[n/2];//优化3,先计算好是否是素数 //注:只判断奇数是否是素数就可以,所以存储空间可以减半 
  18.         for (int k = 0; k < flag.length; k++) { 
  19.             if(isPrime(2*k+1)) 
  20.                 flag[k]=true;            
  21.         } 
  22.  
  23.         for (int i = 6; i <=n; i += 2) { 
  24.             for (int j = 3; j < i; j+=2) { //优化:1.从3开始;2.检查奇数即可 
  25. //              if (isPrime(j) && isPrime(i - j)) { 
  26.                 if(flag[(j-1)/2]&&flag[(i-j-1)/2]){//优化3 
  27.                     System.out.println(i + "=" + j + "+" + (i - j)); 
  28.                     break
  29.                 } 
  30.             } 
  31.         } 
  32.  
  33.         //Guess2 
  34.         boolean bflag = false
  35.         for (int i = 9; i <= n; i += 2) { 
  36.             for (int j = 3; j < n; j+=2) { 
  37.                 for (int k = 3; k <= (i - j - 3); k+=2) { 
  38.                 //  if (isPrime(k) && isPrime(j) && isPrime(i - k - j)) { 
  39.                     if (flag[(k - 1) / 2] && flag[(j - 1) / 2
  40.                             && flag[(i - k - j - 1) / 2]) { 
  41.                         System.out.println(i + "=" + j + "+" + k + "+" 
  42.                                 + (i - j - k)); 
  43.                         bflag = true
  44.                         break
  45.                     } 
  46.                 } 
  47.                 if(bflag) break
  48.             } 
  49.             bflag = false
  50.         } 
  51.          
  52.         long en = System.currentTimeMillis(); 
  53.         System.out.println((en-st)+"ms"); 
  54.     } 
  55.  
  56.     /** 
  57.      * “素数”,又称“质数”,是指:除1和其自身之外,没有其它约数的正整数 如 
  58.      * 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,... 2是最小的质数,也是唯一的偶质数,质数有无数多个 
  59.      * 与素数相对的,有“合数”: 除1和其自身之外,仍有其它约数的正整数 规定:1既不是质数,也不是合数 
  60.      *  
  61.      * @param n 
  62.      * @return 
  63.      */ 
  64.     public static boolean isPrime(int n) { 
  65.         for (int i = 2; i <= Math.sqrt(n); i++) { 
  66.             if (n % i == 0) { 
  67.                 return false
  68.             } 
  69.         } 
  70.         return true
  71.     }