南邮 OJ 2064 哥德巴赫猜想

哥德巴赫猜想

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 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");
		}
	}
}


你可能感兴趣的:(ACM,哥德巴赫猜想,南邮OJ)