1. 程式人生 > >C語言驗證哥德巴赫猜想程式碼及及解析

C語言驗證哥德巴赫猜想程式碼及及解析

問題描述

2000以內的不小於4的正偶數都能夠分解為兩個素數之和(即驗證歌德巴赫猜想對2000以內的正偶數成立)。

問題分析

根據問題描述,為了驗證歌德巴赫猜想對2000以內的正偶數都是成立的,要將整數分解為兩部分,然後判斷分解出的兩個整數是否均為素數。若是,則滿足題意,否則應重新進行分解和判斷。

演算法設計

定義一個函式,函式名設為fun,在其中判斷傳進來的實際引數(設為n(n≥2)),是否為素數,如果是素數則返回1,否則返回0。需要注意的是,在所有偶數中,只有2是唯一的素數。因此,在函式fun中,可以分為以下4種情況來判斷:

  • n=2,是素數,返回1。
  • n是偶數,不是素數,返回0。
  • n是奇數,不是素數,返回0。
  • n≠2,是素數,返回1。

 在主函式中,使用迴圈結構,每輸入一個數據就處理一次,直到遇到檔案結束符則終止輸入。下面詳述主函式中處理資料的過程。

 由於已經對輸出做了限定,即當輸出結果時,如果有多組解,則輸出a最小的那組解。顯然,對每個讀入的資料a必然小於或等於n/2,因此,定義迴圈變數i,使其從2〜n/2進行迴圈,每次迴圈都做如下判斷:fun(i)&&fun(n-i)是否為1。

 如果fun(i)&&fun(n-i)=1,則表示fun(i)=1同時fun(n-i)=1。由fun()函式的定義可知,此時i和n-i都為素數,又由於i是從2〜n/2按由小到大的順序來迭代的,因此(i,n-i) 是求出的一組解,且該組解必然是所有可能解中a值最小的。

 還需要注意的是,由於除了2以外的偶數不可能是素數,因此i值的可能取值只能是2和所有的奇數。

下面是完整的程式碼:

#include<math.h>
#include<stdio.h>
int fun(int n)
{
    int i;
    if(n==2)
        return 1;  /*n是2,返回1*/
    if(n%2==0)
        return 0;  /*n是偶數,不是素數,返回0*/
    for(i=3; i<=sqrt(n); i+=2)
        if(n%i==0)
            return 0;  /*n是奇數,不是素數,返回0*/
    return 1;  /*n是除2以外的素數返回1*/
}
int main()
{
    int n, i, ok;
    while(scanf("%d",&n)!=EOF)
    {
        ok=0;  /*進入迴圈前先置標誌位*/
        for(i=2; i<=n/2; i++)
        {
            if( fun(i) )
                if( fun(n-i) )
                {
                    printf("%d %d\n", i, n-i);  /*i和n-i都是素數,則列印*/
                    ok=1;
                }
            if(i!=2)
                i++;
            if(ok)
                break;  /*已打印出所需要的輸出結果,跳出迴圈*/
        }
    }
    return 0;
}

執行結果:

100
3 97
5
2 3
99
2 97
1000
3 997

C語言驗證哥德巴赫猜想程式碼及及解析