东华oj-进阶题第51题-哥德巴赫猜想

东华oj-进阶题第51题-哥德巴赫猜想_第1张图片

51 歌德巴赫猜想

作者: z sj 时间限制: 2S章节: 函数

问题描述 :

歌德巴赫猜想指出:任何一个大于2的偶数,都可以表示成两个素数的和。例如:8 = 3+5, 44 =
13+31等。试编程在6至100范围内验证歌德巴赫猜想。 输入说明 :

先输入一个正整数n,表示有n组测试数据。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。每组输入数据由一行组成,在接下来的n行中,每行有1个偶数a(6≤a≤100),在行首和行尾没有多余的空格。
输出说明 :

对于每组输入,输出满足歌德巴赫猜想两个素数,小的素数的在前,在行首和行尾没有多余的空格。如果有多组结果,输出的第一个素数要求最小。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。
输入范例 : 2 8 44 输出范例 : 3 5 3 41

方法1代码:

/*
	T51 哥德巴赫猜想 
	算法概述:将目标偶数从小到大拆成两数之和,判断每一组
	拆法中的每一个数是不是素数即可 
*/

#include 
#include 

int isPrime(int n);

int main() {
	int n = 0, a = 0;
	int i = 0;
	
	scanf("%d", &n);
	while (n--) {
		scanf("%d", &a);
		
		for (i = 2; i <= a / 2; i++) {
			if (isPrime(i) && isPrime(a - i)) {
				printf("%d %d\n", i, a - i);
				break;
			}
		}
	} 
	
	return 0;
}

// 判断素数
int isPrime(int n) {
	int i = 0;
	
	if (n == 2)
		return 1;
	for (i = 2; i <= sqrt(n); i++) {
		if (n % i == 0)
			return 0;
	}
	return 1;
} 

方法2代码(利用素数表):

/*
	T51 哥德巴赫猜想 
	算法概述:将目标偶数从小到大拆成两数之和,判断每一组
	拆法中的每一个数是不是素数即可 
*/

#include 
#define MAX_SIZE 100

int primeTable[MAX_SIZE];// 素数表 

int main() {
	int n = 0, a = 0;
	int i = 0;
	int x = 0;
	
	for (i = 1; i < MAX_SIZE; i++)
		primeTable[i] = 1;
	x = 2;
	primeTable[x] = 1;// 建立素数表 
	while (x < MAX_SIZE) {
		if (primeTable[x] == 1) {
			for (i = 2; x * i < MAX_SIZE; i++) {
				primeTable[x * i] = 0;
			}
		}
		x++;
	}
	
	scanf("%d", &n);
	while (n--) {
		scanf("%d", &a);
		
		for (i = 2; i <= a / 2; i++) {
			if (primeTable[i] && primeTable[a - i]) {
				printf("%d %d\n", i, a - i);
				break;
			}
		}
	} 
	
	return 0;
}

你可能感兴趣的:(东华复试上机准备)