原文地址已经不记得了,对代码做一些优化。当n较大时可以O(1)判断素数是一个可取的选择。
- /**
- * 哥德巴赫猜想大致可以分为两个猜想:
- * 1.每个不小于6的偶数都是两个奇素数之和;
- * 2.每个不小于9的奇数都是三个奇素数之和。
- *
- * @author yangwen
- * @modify eric
- */
- public class Guess {
- public static void main(String args[]) {
- long st = System.currentTimeMillis();
- int n = 100000;
- boolean[] flag =new boolean[n/2];//优化3,先计算好是否是素数 //注:只判断奇数是否是素数就可以,所以存储空间可以减半
- for (int k = 0; k < flag.length; k++) {
- if(isPrime(2*k+1))
- flag[k]=true;
- }
- for (int i = 6; i <=n; i += 2) {
- for (int j = 3; j < i; j+=2) { //优化:1.从3开始;2.检查奇数即可
- // if (isPrime(j) && isPrime(i - j)) {
- if(flag[(j-1)/2]&&flag[(i-j-1)/2]){//优化3
- System.out.println(i + "=" + j + "+" + (i - j));
- break;
- }
- }
- }
- //Guess2
- boolean bflag = false;
- for (int i = 9; i <= n; i += 2) {
- for (int j = 3; j < n; j+=2) {
- for (int k = 3; k <= (i - j - 3); k+=2) {
- // if (isPrime(k) && isPrime(j) && isPrime(i - k - j)) {
- if (flag[(k - 1) / 2] && flag[(j - 1) / 2]
- && flag[(i - k - j - 1) / 2]) {
- System.out.println(i + "=" + j + "+" + k + "+"
- + (i - j - k));
- bflag = true;
- break;
- }
- }
- if(bflag) break;
- }
- bflag = false;
- }
- long en = System.currentTimeMillis();
- System.out.println((en-st)+"ms");
- }
- /**
- * “素数”,又称“质数”,是指:除1和其自身之外,没有其它约数的正整数 如
- * 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,... 2是最小的质数,也是唯一的偶质数,质数有无数多个
- * 与素数相对的,有“合数”: 除1和其自身之外,仍有其它约数的正整数 规定:1既不是质数,也不是合数
- *
- * @param n
- * @return
- */
- public static boolean isPrime(int n) {
- for (int i = 2; i <= Math.sqrt(n); i++) {
- if (n % i == 0) {
- return false;
- }
- }
- return true;
- }
- }