问题链接: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; }