哥德巴赫猜想
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 96 测试通过 : 40
总提交 : 96 测试通过 : 40
比赛描述
在1742年,德国的一位业余数学家哥德巴赫给欧拉写信,在信中给出了如下猜想:
任何一个大于4的偶数,都可以写成两个素数之和;
这个被誉为“数学皇冠上的明珠”的定理到现在都还没有被证明或证伪,自然激起了yuman的极大兴趣,他现在想通过编程来验证该猜想在小范围里的正确性,你能帮帮他吗?
输入
先输入一个正整数T,表示有T组样例(1<=T<=1000)
对于每一个测试样例,输入一个正整数n (6<=n<=100000,且n为偶数)
输出
对于每个测试样例,如果存在这样的两个素数a,b,则按升序输出两个素数,中间以一个空格分隔,另外,如果这样的a,b有多对满足,则输出(b-a)最大的那对;
如果不存在这样的素数,则输出"Wrong"(不包括引号)
样例输入
2
8
20
样例输出
3 5
3 17
题目来源
yuman
#include<iostream>
#define MAX_N 100001
bool isPrime[MAX_N];
int main(){
int t,n,i,j;
memset(isPrime,1,sizeof(isPrime));
isPrime[0]=isPrime[1]=0;
isPrime[2]=1;
for(i=2;(i<<1)<MAX_N;i++){
isPrime[i<<1] = 0;
}
for(i=3;i<MAX_N;i+=2){
if(isPrime[i]){
for(j=(i<<1);j<MAX_N;j+=i){
isPrime[j] = 0;
}
}
}
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=2;(i<<1)<=n;i++){
if(isPrime[i] && isPrime[n-i]){
break;
}
}
if((i<<1)<=n){
printf("%d %d\n",i,n-i);
}else{
printf("Wrong\n");
}
}
}