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