您的位置:首页 > 其它

Timus Online Judge 哥德巴赫猜想

2014-03-31 17:26 489 查看
http://acm.timus.ru/problem.aspx?space=18&num=10


J. Something Easier

Time limit: 1.0 second

Memory limit: 64 MB

“How do physicists define prime numbers? Very easily: prime numbers are the number 2 and all the odd numbers greater than 2. They may show that this definition corresponds to the mathematical one:
3 is prime, 5 is prime, 7 is prime… 9? 9 is certainly not prime. Then: 11 is prime, 13 is prime. So 9 is the experiment mistake.”

From mathematical analysis course

Once physicist and mathematician argued how many prime numbers one needed for the purpose that their sum was equal to N. One said that it wasn’t known and the other that 3 was always enough.
The question is how many.

Input

The first line contains T, an amount of tests. Then T lines with integer N follow (0 ≤ T ≤ 20; 2 ≤ N ≤ 109).

Output

For each test in a separate line you should output prime numbers so that their sum equals to N. An amount of such prime numbers is to be minimal possible.

Sample

inputoutput
7
2
27
85
192
14983
3
7

2
23 2 2
2 83
11 181
14983
3
7

要做题先明白什么是哥德巴赫猜想

解题思路我写在代码里了:
#include <iostream>
using namespace std;

bool nprime(int k)//判断是否是素数
{
for(int i=2; i*i<=k; ++i)
{
if(k%i==0) return 1;
}
return 0;
}
int main()
{
int t,a;
cin>>t;
while(t--)
{
cin>>a;
if(!nprime(a)) cout<<a<<endl;
else if(a%2==0)//如果是偶数则一定可以表示为两个素数的和
{
int k=a-3;
while(nprime(k) || nprime(a-k)) k-=2;
cout<<k<<" "<<a-k<<endl;
}
else//如果是奇数
{
int k=a-2;//已经排除它本身不是素数了,则下一个奇数有可能是
if(!nprime(k))
{
cout<<k<<' '<<2<<endl;
continue;
}
k-=2;//如果不是
while(nprime(k)) k-=2;//直到是
cout<<k<<" ";
a=a-k;//此时转化成a-k这个数的素数表示了。由哥德巴赫猜想可得现在这个数一定可以由两个素数的和表示
if(a==4)//因为素数中2 是一个唯一的偶数,在这里要单独考虑。不能和下一步并在一起,因为下一步考虑的全是奇数的素数
{
cout<<2<<' '<<2<<endl;
continue;
}
k=a-3;//一不是素数,二已排除,从三开始
while(nprime(k) || nprime(a-k)) k-=2;//循环到能成功表示
cout<<k<<" "<<a-k<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: