问题链接:POJ2262 ZOJ1951 UVa543 Goldbach's Conjecture。基础训练级的题,用C语言编写程序。
这个问题是验证哥德巴赫猜想,对于输入的n,找出一对差值最大的奇素数。
使用穷举法来解决这个问题。
目前POJ使用的C语言编译器,似乎比较古老,在别处可以编译通过的代码,在它这里编译错误。
AC的C语言程序如下:
/* POJ2262 ZOJ1951 UVa543 Goldbach's Conjecture */
#include <stdio.h>
#include <math.h>
#define MAXN 1000000
// 试除法判断一个数是否为素数
int isprime(int n)
{
int end2, i;
if(n == 3)
return 1;
end2 = sqrt(n);
for(i=3; i<=end2; i+=2) {
if(n % i == 0)
break;
}
return i > end2 ? 1 : 0;
}
int main(void)
{
int n;
int okflag, i;
while(scanf("%d", &n) != EOF) {
// 判定结束条件
if(n == 0)
break;
// 寻找素数
okflag = 0;
for(i=3; i<=n/2; i+=2)
if(isprime(i) && isprime(n-i)) {
okflag = 1;
break;
}
// 输出结果
if(okflag)
printf("%d = %d + %d\n", n, i, n-i);
else
printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}
POJ中,编译错误的代码(第10行):
// 试除法判断一个数是否为素数
int isprime(int n)
{
if((n & 1) == 0) // 偶数:n % 2 == 0
return 0;
if(n == 3)
return 1;
int end = sqrt(n), i;
for(i=3; i<=end; i+=2) {
if(n % i == 0)
break;
}
return i > end ? 1 : 0;
}