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<stdio.h>
#include<math.h>
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<stdio.h>
#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;
}