今天早上看到有個朋友說想讓我寫一下1093題,正好也有快一周沒寫過題解了,趁今晚還有些時間就把這篇一直沒動筆的題解完成了吧。

image.png
1093: 驗證哥德巴赫猜想
- 題目描述
哥德巴赫猜想大家都知道一點吧。我們現(xiàn)在不是想證明這個結(jié)論,而是對于任給的一個不小于6的偶數(shù),來尋找和等于該偶數(shù)的所有素數(shù)對。做好了這件實事,就能說明這個猜想是成立的。
要求程序定義一個prime()函數(shù)和一個main()函數(shù),prime()函數(shù)判斷一個整數(shù)n是否是素數(shù),其余功能在main()函數(shù)中實現(xiàn)。
int prime(int n)
{
//判斷n是否為素數(shù), 若n為素數(shù),本函數(shù)返回1,否則返回0
}
對于C/C++代碼的提交,本題要求必須通過定義prime函數(shù)和main函數(shù)實現(xiàn),否則,提交編譯錯誤,要提交完整的程序。 - 輸入
一個偶數(shù)M (M是6到1000000之間的一個偶數(shù)). - 輸出
輸出和等于該偶數(shù)的所有素數(shù)對a和b,按a遞增的順序輸出,(a,b)和(b,a)被視為同一個素數(shù)對。 - 參考代碼:
#include<bits/stdc++.h>
using namespace std;
int prime(int i)
{
int q=0,c,j;
c=(int)sqrt(i);
for(j=2;j<=c;j++){
if(i%j==0){
q=1;}
}
return q;
}
int main()
{
int num;
int i,k,w,e;
scanf("%d",&num);
for(i=3;i<=num/2;i=i+2){
w=0;
e=0; // w和e做判斷素數(shù)用
w=prime(i);
if(w==0)
{
k=num-i;
e=prime(k);
}
if(w==0 && e==0)
printf("%d %d\n",i,k);
}
}
代碼解析:
其實一看題目,就會讓人覺得是很復(fù)雜的題目,所以對待這種題目,我們要學(xué)會分段讀題目和分段寫代碼;
下面我介紹一下我是怎么做這種復(fù)雜的題目的:
- 看輸入輸出。輸入是一個整數(shù),輸出是兩個整數(shù),這是肯定要寫進(jìn)main函數(shù)里面的,我們可以先寫著。
- 看函數(shù)要求。題目要求我們寫一個判斷一個整數(shù)n是否是素數(shù)的函數(shù)。這個應(yīng)該不難吧,素數(shù)其實就是質(zhì)數(shù),如果還覺得難的,應(yīng)該是不懂質(zhì)數(shù)是啥,可以先看一下百度百科→質(zhì)數(shù),大概就是判斷一個數(shù)能否被比它小的數(shù)整除。我這里寫的是判斷不是質(zhì)數(shù)的函數(shù)。
- 下面看main函數(shù)怎么寫,main函數(shù)要完成這個尋找和等于該偶數(shù)的所有素數(shù)對,也就是兩個素數(shù)相加等于這個偶數(shù)了,就說明這兩個素數(shù)符合要求了,輸出這兩個素數(shù)就可以了。
下面我們看回代碼
prime函數(shù): c=(int)sqrt(i); sqrt是求平方根的函數(shù),在前面加int是為了讓它變成整數(shù),方便用來循環(huán)。循環(huán)不一定要這么寫,這個我也忘了當(dāng)時我是怎么想的了,自行理解一下吧,寫出來可能比較好理解。最后判斷不為素數(shù)就返回1,為素數(shù)就返回0.
main函數(shù):這個倒沒什么好說的,判斷返回的值是多少,最后兩個都為0則說明都為符合要求的素數(shù),輸出即可。
今天比較累,題解寫的不是很好,還有什么問題最好還是在評論區(qū)留言吧,我明天起來再行解決。
另外,那個搶紅包的腳本現(xiàn)在已經(jīng)完成的差不多了,還差一步很關(guān)鍵的優(yōu)化界面和打包腳本,應(yīng)該能很快弄成可以下載的版本。屆時找個機會無償上傳百度網(wǎng)盤給大家吧。