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
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-11/155449.htm