Algorithm JAVA寫算法 驗證哥德巴赫猜想

Algorithm JAVA寫算法 驗證哥德巴赫猜想

哥德巴赫猜想換成現代陳述爲:任何一個大於5的整數都可以寫成3個質數之和;另一個版本(歐拉):任何一個大於2的偶數都可以寫成2個質數之和。
現在所說的哥德巴赫猜想一般都是置第二種,兩個多世紀過去了,這一猜想即無法被證實也沒有被推翻。


現在用java寫算法,通過程序在4~100內驗證這個猜想。


先獲取4-100內所有偶數:

package algorithm;

/**
 * Created by zhaoyong on 2016/5/19.
 * 哥德巴赫猜想
 */
public class geDeBaHeCaiXiang {
    public static void main(String[] args) {
        for (int i = 4; i <= 100; i = i + 2) {
            System.out.print("4-100內所有偶數->" + i + "\n");
        }
    }
}

然後需要將每一個數i,拆分成a+b(a < b)的形式,a的範圍是2~i/2,因爲如果a>i/2,那麼a+b肯定大於i了。
如果a和b都是質數,就將其打印出來。
先寫個打印的方法,方便輸出

private static void print(Object s) {
    System.out.print(s.toString() + "\n");
}

判斷一個大於2的數是不是質數

    //判斷一個大於2的數是不是質數
    private static boolean isPrime(int i) {
        for (int j = 2; j < i - 1; j++) {
            if (i % j == 0) {
                return false;
            }
        }
        return true;
    }

這裏面就不用b了,因爲b就是i-a,那就寫成i-a好了,如果a是質數,i-a是質數,那麼就滿足條件

完整代碼

package algorithm;

/**
 * Created by zhaoyong on 2016/5/19.
 * 哥德巴赫猜想
 */
public class geDeBaHeCaiXiang {

    public static void main(String[] args) {
        for (int i = 4; i <= 100; i = i + 2) {
            for (int a = 2; a <= i / 2; a++) {
                if (isPrime(a) && isPrime(i - a)) {
                    print(i + "是兩個質數之和 = " + a + "+" + (i - a));
                    break;
                }
            }

        }
    }

    //判斷一個大於2的數是不是質數
    private static boolean isPrime(int i) {
        for (int j = 2; j < i - 1; j++) {
            if (i % j == 0) {
                return false;
            }
        }
        return true;
    }

    //輸出
    private static void print(Object s) {
        System.out.print(s.toString() + "\n");
    }

}

輸出結果

4是兩個質數之和 = 2+2
6是兩個質數之和 = 3+3
8是兩個質數之和 = 3+5
10是兩個質數之和 = 3+7
12是兩個質數之和 = 5+7
14是兩個質數之和 = 3+11
16是兩個質數之和 = 3+13
18是兩個質數之和 = 5+13
20是兩個質數之和 = 3+17
22是兩個質數之和 = 3+19
24是兩個質數之和 = 5+19
26是兩個質數之和 = 3+23
28是兩個質數之和 = 5+23
30是兩個質數之和 = 7+23
32是兩個質數之和 = 3+29
34是兩個質數之和 = 3+31
36是兩個質數之和 = 5+31
38是兩個質數之和 = 7+31
40是兩個質數之和 = 3+37
42是兩個質數之和 = 5+37
44是兩個質數之和 = 3+41
46是兩個質數之和 = 3+43
48是兩個質數之和 = 5+43
50是兩個質數之和 = 3+47
52是兩個質數之和 = 5+47
54是兩個質數之和 = 7+47
56是兩個質數之和 = 3+53
58是兩個質數之和 = 5+53
60是兩個質數之和 = 7+53
62是兩個質數之和 = 3+59
64是兩個質數之和 = 3+61
66是兩個質數之和 = 5+61
68是兩個質數之和 = 7+61
70是兩個質數之和 = 3+67
72是兩個質數之和 = 5+67
74是兩個質數之和 = 3+71
76是兩個質數之和 = 3+73
78是兩個質數之和 = 5+73
80是兩個質數之和 = 7+73
82是兩個質數之和 = 3+79
84是兩個質數之和 = 5+79
86是兩個質數之和 = 3+83
88是兩個質數之和 = 5+83
90是兩個質數之和 = 7+83
92是兩個質數之和 = 3+89
94是兩個質數之和 = 5+89
96是兩個質數之和 = 7+89
98是兩個質數之和 = 19+79
100是兩個質數之和 = 3+97

Process finished with exit code 0

這裏輸出的是a爲最小值的時候i等於兩個質數相加的結果,要是想輸出所有的i等於兩個質數相加,那麼只要去掉main方法裏面的break;就行了。
輸出結果如下

4是兩個質數之和 = 2+2
6是兩個質數之和 = 3+3
8是兩個質數之和 = 3+5
10是兩個質數之和 = 3+7
10是兩個質數之和 = 5+5
12是兩個質數之和 = 5+7
14是兩個質數之和 = 3+11
14是兩個質數之和 = 7+7
16是兩個質數之和 = 3+13
16是兩個質數之和 = 5+11
18是兩個質數之和 = 5+13
18是兩個質數之和 = 7+11
20是兩個質數之和 = 3+17
20是兩個質數之和 = 7+13
22是兩個質數之和 = 3+19
22是兩個質數之和 = 5+17
22是兩個質數之和 = 11+11
24是兩個質數之和 = 5+19
24是兩個質數之和 = 7+17
24是兩個質數之和 = 11+13
26是兩個質數之和 = 3+23
26是兩個質數之和 = 7+19
26是兩個質數之和 = 13+13
28是兩個質數之和 = 5+23
28是兩個質數之和 = 11+17
30是兩個質數之和 = 7+23
30是兩個質數之和 = 11+19
30是兩個質數之和 = 13+17
32是兩個質數之和 = 3+29
32是兩個質數之和 = 13+19
34是兩個質數之和 = 3+31
34是兩個質數之和 = 5+29
34是兩個質數之和 = 11+23
34是兩個質數之和 = 17+17
36是兩個質數之和 = 5+31
36是兩個質數之和 = 7+29
36是兩個質數之和 = 13+23
36是兩個質數之和 = 17+19
38是兩個質數之和 = 7+31
38是兩個質數之和 = 19+19
40是兩個質數之和 = 3+37
40是兩個質數之和 = 11+29
40是兩個質數之和 = 17+23
42是兩個質數之和 = 5+37
42是兩個質數之和 = 11+31
42是兩個質數之和 = 13+29
42是兩個質數之和 = 19+23
44是兩個質數之和 = 3+41
44是兩個質數之和 = 7+37
44是兩個質數之和 = 13+31
46是兩個質數之和 = 3+43
46是兩個質數之和 = 5+41
46是兩個質數之和 = 17+29
46是兩個質數之和 = 23+23
48是兩個質數之和 = 5+43
48是兩個質數之和 = 7+41
48是兩個質數之和 = 11+37
48是兩個質數之和 = 17+31
48是兩個質數之和 = 19+29
50是兩個質數之和 = 3+47
50是兩個質數之和 = 7+43
50是兩個質數之和 = 13+37
50是兩個質數之和 = 19+31
52是兩個質數之和 = 5+47
52是兩個質數之和 = 11+41
52是兩個質數之和 = 23+29
54是兩個質數之和 = 7+47
54是兩個質數之和 = 11+43
54是兩個質數之和 = 13+41
54是兩個質數之和 = 17+37
54是兩個質數之和 = 23+31
56是兩個質數之和 = 3+53
56是兩個質數之和 = 13+43
56是兩個質數之和 = 19+37
58是兩個質數之和 = 5+53
58是兩個質數之和 = 11+47
58是兩個質數之和 = 17+41
58是兩個質數之和 = 29+29
60是兩個質數之和 = 7+53
60是兩個質數之和 = 13+47
60是兩個質數之和 = 17+43
60是兩個質數之和 = 19+41
60是兩個質數之和 = 23+37
60是兩個質數之和 = 29+31
62是兩個質數之和 = 3+59
62是兩個質數之和 = 19+43
62是兩個質數之和 = 31+31
64是兩個質數之和 = 3+61
64是兩個質數之和 = 5+59
64是兩個質數之和 = 11+53
64是兩個質數之和 = 17+47
64是兩個質數之和 = 23+41
66是兩個質數之和 = 5+61
66是兩個質數之和 = 7+59
66是兩個質數之和 = 13+53
66是兩個質數之和 = 19+47
66是兩個質數之和 = 23+43
66是兩個質數之和 = 29+37
68是兩個質數之和 = 7+61
68是兩個質數之和 = 31+37
70是兩個質數之和 = 3+67
70是兩個質數之和 = 11+59
70是兩個質數之和 = 17+53
70是兩個質數之和 = 23+47
70是兩個質數之和 = 29+41
72是兩個質數之和 = 5+67
72是兩個質數之和 = 11+61
72是兩個質數之和 = 13+59
72是兩個質數之和 = 19+53
72是兩個質數之和 = 29+43
72是兩個質數之和 = 31+41
74是兩個質數之和 = 3+71
74是兩個質數之和 = 7+67
74是兩個質數之和 = 13+61
74是兩個質數之和 = 31+43
74是兩個質數之和 = 37+37
76是兩個質數之和 = 3+73
76是兩個質數之和 = 5+71
76是兩個質數之和 = 17+59
76是兩個質數之和 = 23+53
76是兩個質數之和 = 29+47
78是兩個質數之和 = 5+73
78是兩個質數之和 = 7+71
78是兩個質數之和 = 11+67
78是兩個質數之和 = 17+61
78是兩個質數之和 = 19+59
78是兩個質數之和 = 31+47
78是兩個質數之和 = 37+41
80是兩個質數之和 = 7+73
80是兩個質數之和 = 13+67
80是兩個質數之和 = 19+61
80是兩個質數之和 = 37+43
82是兩個質數之和 = 3+79
82是兩個質數之和 = 11+71
82是兩個質數之和 = 23+59
82是兩個質數之和 = 29+53
82是兩個質數之和 = 41+41
84是兩個質數之和 = 5+79
84是兩個質數之和 = 11+73
84是兩個質數之和 = 13+71
84是兩個質數之和 = 17+67
84是兩個質數之和 = 23+61
84是兩個質數之和 = 31+53
84是兩個質數之和 = 37+47
84是兩個質數之和 = 41+43
86是兩個質數之和 = 3+83
86是兩個質數之和 = 7+79
86是兩個質數之和 = 13+73
86是兩個質數之和 = 19+67
86是兩個質數之和 = 43+43
88是兩個質數之和 = 5+83
88是兩個質數之和 = 17+71
88是兩個質數之和 = 29+59
88是兩個質數之和 = 41+47
90是兩個質數之和 = 7+83
90是兩個質數之和 = 11+79
90是兩個質數之和 = 17+73
90是兩個質數之和 = 19+71
90是兩個質數之和 = 23+67
90是兩個質數之和 = 29+61
90是兩個質數之和 = 31+59
90是兩個質數之和 = 37+53
90是兩個質數之和 = 43+47
92是兩個質數之和 = 3+89
92是兩個質數之和 = 13+79
92是兩個質數之和 = 19+73
92是兩個質數之和 = 31+61
94是兩個質數之和 = 5+89
94是兩個質數之和 = 11+83
94是兩個質數之和 = 23+71
94是兩個質數之和 = 41+53
94是兩個質數之和 = 47+47
96是兩個質數之和 = 7+89
96是兩個質數之和 = 13+83
96是兩個質數之和 = 17+79
96是兩個質數之和 = 23+73
96是兩個質數之和 = 29+67
96是兩個質數之和 = 37+59
96是兩個質數之和 = 43+53
98是兩個質數之和 = 19+79
98是兩個質數之和 = 31+67
98是兩個質數之和 = 37+61
100是兩個質數之和 = 3+97
100是兩個質數之和 = 11+89
100是兩個質數之和 = 17+83
100是兩個質數之和 = 29+71
100是兩個質數之和 = 41+59
100是兩個質數之和 = 47+53

Process finished with exit code 0

換一種好看點的輸出形式

public static void main(String[] args) {
        for (int i = 4; i <= 100; i = i + 2) {
            String str = "";
            for (int a = 2; a <= i / 2; a++) {
                if (isPrime(a) && isPrime(i - a)) {
                    str = str + "=" + a + "+" + (i - a);
                }
            }
            print(i + "是兩個質數之和 " + str);
        }
    }

輸出結果

4是兩個質數之和 =2+2
6是兩個質數之和 =3+3
8是兩個質數之和 =3+5
10是兩個質數之和 =3+7=5+5
12是兩個質數之和 =5+7
14是兩個質數之和 =3+11=7+7
16是兩個質數之和 =3+13=5+11
18是兩個質數之和 =5+13=7+11
20是兩個質數之和 =3+17=7+13
22是兩個質數之和 =3+19=5+17=11+11
24是兩個質數之和 =5+19=7+17=11+13
26是兩個質數之和 =3+23=7+19=13+13
28是兩個質數之和 =5+23=11+17
30是兩個質數之和 =7+23=11+19=13+17
32是兩個質數之和 =3+29=13+19
34是兩個質數之和 =3+31=5+29=11+23=17+17
36是兩個質數之和 =5+31=7+29=13+23=17+19
38是兩個質數之和 =7+31=19+19
40是兩個質數之和 =3+37=11+29=17+23
42是兩個質數之和 =5+37=11+31=13+29=19+23
44是兩個質數之和 =3+41=7+37=13+31
46是兩個質數之和 =3+43=5+41=17+29=23+23
48是兩個質數之和 =5+43=7+41=11+37=17+31=19+29
50是兩個質數之和 =3+47=7+43=13+37=19+31
52是兩個質數之和 =5+47=11+41=23+29
54是兩個質數之和 =7+47=11+43=13+41=17+37=23+31
56是兩個質數之和 =3+53=13+43=19+37
58是兩個質數之和 =5+53=11+47=17+41=29+29
60是兩個質數之和 =7+53=13+47=17+43=19+41=23+37=29+31
62是兩個質數之和 =3+59=19+43=31+31
64是兩個質數之和 =3+61=5+59=11+53=17+47=23+41
66是兩個質數之和 =5+61=7+59=13+53=19+47=23+43=29+37
68是兩個質數之和 =7+61=31+37
70是兩個質數之和 =3+67=11+59=17+53=23+47=29+41
72是兩個質數之和 =5+67=11+61=13+59=19+53=29+43=31+41
74是兩個質數之和 =3+71=7+67=13+61=31+43=37+37
76是兩個質數之和 =3+73=5+71=17+59=23+53=29+47
78是兩個質數之和 =5+73=7+71=11+67=17+61=19+59=31+47=37+41
80是兩個質數之和 =7+73=13+67=19+61=37+43
82是兩個質數之和 =3+79=11+71=23+59=29+53=41+41
84是兩個質數之和 =5+79=11+73=13+71=17+67=23+61=31+53=37+47=41+43
86是兩個質數之和 =3+83=7+79=13+73=19+67=43+43
88是兩個質數之和 =5+83=17+71=29+59=41+47
90是兩個質數之和 =7+83=11+79=17+73=19+71=23+67=29+61=31+59=37+53=43+47
92是兩個質數之和 =3+89=13+79=19+73=31+61
94是兩個質數之和 =5+89=11+83=23+71=41+53=47+47
96是兩個質數之和 =7+89=13+83=17+79=23+73=29+67=37+59=43+53
98是兩個質數之和 =19+79=31+67=37+61
100是兩個質數之和 =3+97=11+89=17+83=29+71=41+59=47+53

Process finished with exit code 0

好了,這樣就寫完了哥德巴赫猜想在100以內的驗證了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章