原题链接:点击打开链接
题意:将一个数拆分成四个素数(可以为同一个素数)相加的和;若不能拆分输出“ Impossible.”
思路: 哥德巴赫猜想:>=4的偶数可以拆分成两个素数的和
哥德巴赫猜想推论>=8的偶数都能被拆分成四个素数相加的形式
8=2+2+2+2,2是最小的素数,8是能被拆分的最小数,当n<8时 输出“Impossible”,
如果是奇数可以拆成2+3+ n-5(偶数),n-5这个数一定可以拆成两个素数相加;
如果是偶数 可以拆成2+2+ n-4(偶数),n-4这个数一定可以拆成两个素数相加;
code:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxx=10000007;
int prim[1000000],s[maxx];
int cnt;
void init()
{
cnt=0;
memset(s,0,sizeof(0));
s[1]=1;
s[0]=1;
for(int i=2;i<maxx;i++)
{
if(!s[i])
{
prim[cnt++]=i;
for(int j=i+i;j<maxx;j+=i)
s[j]=1;
}
}
}
int main()
{
int n,i,j;
init();
while(scanf("%d",&n)!=EOF)
{
if(n<8)
{
printf("Impossible.\n");
continue;
}
if(n%2==0)
{
int a=2;
int b=2;
int c,d;
n-=4;
for(i=0;i<cnt;i++)
{
if(n<prim[i])
break;
int t=n-prim[i];//printf("n-prim[i]= %d\n",s[t]);
if(s[t]==0)
{
c=prim[i];
d=n-prim[i];
break;
}
}
printf("%d %d %d %d\n",a,b,c,d);
}
else
{
int a=2;
int b=3;
int c,d;
n-=5;
for( i=0;i<cnt;i++)
{
if(s[n-prim[i]]==0)
{
c=prim[i];
d=n-prim[i];
break;
}
}
printf("%d %d %d %d\n",a,b,c,d);
}
}
return 0;
}