题目大意:将T个正整数N拆成若干个素数之和,最小化素数个数。
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
数据规模:0<=T<=20,2<=N<=10^9。
理论基础:哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。大于等于7的奇数都可以表示成三个质数之和。
题目分析:唉,这理论一摆出来,我都无话可说了,自己想吧。(虽然没完全证明,可是在数据规模内尚无反例。嘎嘎、、、)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
typedef long unsigned LU;
bool isprime(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)return false;
}
return true;
}
int main()
{
int T;
scanf("%d\n",&T);
while(T--)
{
int n,k;
scanf("%d",&n);
if(isprime(n))
{
printf("%d\n",n);
continue;
}
if(n%2==0)
{
k=n-3;
while(!(isprime(k)&&isprime(n-k)))k-=2;
printf("%d %d\n",n-k,k);
}
else
{
int k=n-2;
if(isprime(k))
{
printf("2 %d\n",k);
continue;
}
k-=2;
while(!isprime(k))k-=2;
printf("%d ",k);
n=n-k;
if(n==4)
{
printf("2 2\n");
continue;
}
k=n-3;
while(!(isprime(k)&&isprime(n-k)))k-=2;
printf("%d %d\n",k,n-k);
}
}
return 0;
}
其中,减三和减二是因为素数肯定是奇数(2除外)。
参考文献:
http://zh.wikipedia.org/wiki/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3
by:Jsun_moon http://blog.csdn.net/Jsun_moon