Description
“自然科学的皇后是数学。数学的皇冠是数论。哥德巴赫猜想,则是皇冠上的明珠。”哥德巴赫猜想表述为:任一大于2的偶数都可写成两个质数之和。当然我们今天不是来证明哥德巴赫猜想的,而是验证对于比较小的偶数其猜想是否成立。
Input
数据的第一行是一个正整数T(0<T<=100),表示有T组测试数据。
每组测试数据只有一行,为一个偶数M(2<M<=100000),表示要验证的偶数。
Output
对于每组测试数据,在一行上输出两个质数A,B(A<=B),表示M=A+B,如果有多种可能,则输出B-A的值最小的那组。
Sample Input
3
6
10
12
Sample Output
3 3
5 5
5 7
解题思路:
主要是考察素数的判断,另外B-A值最小其实就是让A最大。主要还是科普题
公元1742年6月7日哥德巴赫(Goldbach)写信给当时的大数学家欧拉(Euler),提出了以下的猜想:
(a) 任何一个≥6之偶数,都可以表示成两个奇质数之和。
(b) 任何一个≥9之奇数,都可以表示成三个奇质数之和。
#include<iostream>
using namespace std;
const int N = 100001;
bool isPrime[N];
int primes[N/6];
void getPrimes()
{
for(int i=0;i<N;++i)
isPrime[i] = true;
int k=0;
for(int i=2;i<N;++i)
{
if(isPrime[i])
{
for(int j=2*i;j<N;j+=i)
isPrime[j] = false;
primes[k++] = i;
}
}
}
int main()
{
int T;
getPrimes();
while(cin>>T)
{
for(int i=0;i<T;++i)
{
int M;
cin>>M;
int halfM = M/2;
int A,B;
for(int k=0;primes[k]<=halfM;++k)
{
if(isPrime[M-primes[k]])
{
A = primes[k];
B = M-primes[k];
}
}
cout<<A<<" "<<B<<endl;
}
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s