洛谷P1579 哥德巴赫猜想(升級版)題解

洛谷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;
	}
}

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