题目描述
分析
Euler证明的经典定理之一是素数在数量上是无限的。但每个数字是否可以表示成4个 素数的总和
- 当 n < 8 时,一定不存在合法答案(因为连和最小的 2 2 2 2都表示不出来)
- .当 n > 8 时,因为要分成4个素数,所以可以先分出两个素数,使剩下的和为一个偶数,那么按照哥德巴赫猜想,剩下的一定能够分成两个素数,所以分类讨论如下:
(1)当n为偶数时,先分出两个2,剩下个偶数,分解得解。
(2)当n为奇数时,先分出2 和 3,剩下个偶数,分解得解。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 10000005;
int n, cnt;
int prime[maxn];
bool check[maxn];
void Euler(int num)
{
check[1] = true;
for(int i = 2; i <= num; i++)
{
if(!check[i]) prime[++cnt] = i;
for(int j = 1; j <= cnt && i * prime[j] <= num; j++)
{
check[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
}
int main()
{
Euler(10000005);
while(~scanf("%d", &n))
{
if(n < 8)
{
cout << "Impossible." << endl;
continue;
}
if(n % 2 == 0)
{
cout << "2 2 ";
n -= 4;
for( int i = 1; i <= cnt; i++)
{
if(!check[n - prime[i]])
{
cout << prime[i] << ' ' << n - prime[i] << '\n';
break;
}
}
}
else {
cout << "2 3 ";
n -= 5;
for(int i = 1; i <= cnt; i++)
{
if(!check[n - prime[i]])
{
cout << prime[i] << ' ' << n - prime[i] << '\n';
break;
}
}
}
}
return 0;
}