PTA驗證哥德巴赫猜想

羽一住發表於2020-11-11

數學領域著名的“哥德巴赫猜想”的大致意思是:任何一個大於2的偶數總能表示為兩個素數之和。比如:24=5+19,其中5和19都是素數。本實驗的任務是設計一個程式,驗證20億以內的偶數都可以分解成兩個素數之和。

輸入格式:

輸入在一行中給出一個(2, 2 000 000 000]範圍內的偶數N。

輸出格式:

在一行中按照格式“N = p + q”輸出N的素數分解,其中p ≤ q均為素數。又因為這樣的分解不唯一(例如24還可以分解為7+17),要求必須輸出所有解中p最小的解。

輸入樣例:

24

輸出樣例:

24 = 5 + 19

思考
給的數字的範圍(2, 2 000 000 000], 所以,根本不用判斷0, 1 啊
可以不用flag,不是素數直接return 0
看到題, emmm, 很簡單嘛,考察素數。 第一次提交,媽的,哪裡錯了 第二次,哪裡錯了,哪裡錯了??? …
第N次,次奧,是<=n啊!!!!!這個傻逼問題出錯好幾次了!!!!!

程式碼

錯誤的

#include<iostream>
#include<cmath>
using namespace std;
int primer(int n)
{
	/*if(n == 1 || n==0) return 0;
	if(n == 2) return 1;
	int flag = 1;*/可省略
	for(int i = 2; i < sqrt(n); i++)//!!!!!!已經犯過這樣的錯誤了
	{
		if(n % i==0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int  n;
	cin >> n;
	for(int i = 2; i <= n/2; i++)
	{
		
		if(primer(i)&&primer(n-i))
		{
			cout <<  n << " = " << i << " + " << n-i;
			break;
		}		
	}
 } 

正確的

#include<iostream>
#include<cmath>
using namespace std;
int primer(int n)
{
	
	for(int i = 2; i < sqrt(n); i++)
	{
		if(n % i==0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int  n;
	cin >> n;
	for(int i = 2; i <= n/2; i++)
	{
		
		if(primer(i)&&primer(n-i))
		{
			cout <<  n << " = " << i << " + " << n-i;
			break;
		}		
	}
 } 

相關文章