洛谷P1579 哥德巴赫猜想(升級版)題解
這是本蒟蒻第一次發題解,望神犇們指正。
原題如圖
現在先分析一下這道題,這道題數據強度不大隻有20000,時間限制爲1s,內存限制爲125M。當然如果你想用一般的窮舉來判斷素數的話是會超時的,所以我們在判斷素數上採用埃氏篩法。
\\這是埃氏篩的子函數
void prime(int n)
{
a[0]=a[1]=true;
for(int i=2;i<=n;i++) \\如果一個數是質數,那麼這個數的倍數就一定都是合數
if(!a[i]) \\當a[i]爲false時說明i爲質數
{
b[cnt++]=i;
for(int j=i*i;j<=n;j+=i) \\標記i的倍數爲合數
a[j]=true;
}
}
現在附上AC代碼
#include<bits/stdc++.h> \\萬能頭大法好
using namespace std;
bool a[20005];
int b[20005];
int cnt=0;
void prime(int n)
{
a[0]=a[1]=true;
for(int i=2;i<=n;i++)
if(!a[i])
{
b[cnt++]=i;
for(int j=i*i;j<=n;j+=i)
a[j]=true;
}
}
int main (void)
{
int n,flag=0;
scanf("%d",&n);
prime(n);
for(int i=0;i<cnt;i++) \\雙重循環進行窮盡
{
for(int j=0;j<cnt;j++)
if(!a[n-b[i]-b[j]]&&n-b[i]-b[j]>0)
{
flag=1; \\判斷已經找到符合要求的組合
printf("%d %d %d",b[i],b[j],n-b[i]-b[j]);
break;
}
if(flag) \\如果已經找到符合要求的組合就跳出循環
break;
}
}