題目
現在請你編一個程序驗證哥德巴赫猜想。
先給出一個奇數n,要求輸出3個質數,這3個質數之和等於輸入的奇數。
輸入格式
僅有一行,包含一個正奇數n,其中9<n<20000
輸出格式
僅有一行,輸出3個質數,這3個質數之和等於輸入的奇數。相鄰兩個質數之間用一個空格隔開,最後一個質數後面沒有空格。如果表示方法不唯一,請輸出第一個質數最小的方案,如果第一個質數最小的方案不唯一,請輸出第一個質數最小的同時,第二個質數最小的方案。
解析
最簡單的素數篩了。
代碼
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<cstring>
using namespace std;
const int maxn = 20005;
int prime[maxn];
int f()
{
fill(prime , prime + maxn , 0);
prime[1] = 0;
prime[2] = 0;
for(int i = 2 ; i <= maxn ; i ++)
{
if(prime[i] == 0)
{
for(int j = i * i ;j <= maxn ;j += i)
prime[j] = 1;
}
}
//質數---0
}
int main()
{
f();
int n;
cin >> n;
for(int i = 2; i <= maxn ; i ++)
{
if( prime[i]) continue;
for(int j = i ; j <= maxn ; j ++)
{
if( prime[j]) continue;
int q = n - i - j;
if( q <= 0) continue;
if( ! prime[q])
{
cout << i << " " << j << " " << q << endl;
return 0;
}
}
}
}