用C代码实现Goldbach猜想

时间:2015-02-20 18:43:55

标签: c algorithm math primes goldbach-conjecture

#include <stdio.h>

int prime(int num);

int main() {
    int upper, lower, tempL, x;

    printf("Enter lower limit:");
    scanf("%d", &lower);

    printf("Enter upper limit:");
    scanf("%d", &upper);

    for (lower; lower <= upper; lower + 2) {
        tempL = lower;
        for (lower; lower != 0; lower--) {
            if (prime(lower) == 0) { //after decrementing we find a prime
                x = tempL - (lower); x = the original lower limit minus the current decremented lower limit
                if (prime(x) == 0) { //if x if prime do following
                    printf("%d = %d + %d\n", tempL, lower, x); //print
                    break;
                }
            }
        }
    }
}

int prime(int number) { //returns 0 if number is prime
    int i;
    for (i = 2; i < number / 2; i++) {
        if (number % i == 0) {
            return 1;
        }
    }
    return 0;
}

这就是我到目前为止......所有这一切都是无休止地打印

999983 = 999983 + 0

我真的被困在这里了。我一直试图在过去8小时内得到这个。

我正在尝试使用Goldbach的猜想来打印数字作为素数的总和。一旦打印出数字n,它应该移动到n + 1,直到它达到上限。

现在我有了这个

#include <stdio.h>

int prime(int num);

int main() {
    int upper, lower, tempL, x;

    printf("Enter lower limit:");
    scanf("%d", &lower);

    printf("Enter upper limit:");
    scanf("%d", &upper);

    for (lower; lower <= upper; lower + 2) {
        tempL = lower;
        for (tempL; tempL != 0; tempL--) {
            if (prime(tempL == 0) { //after decrementing we find a prime
                x = lower - (tempL); x = the original lower limit minus the current decremented lower limit
                if (prime(x) == 0) { //if x if prime do following
                    printf("%d = %d + %d\n", tempL, lower, x); //print
                    break;
                }
            }
        }
    }
}          

int prime(int number) { //returns 0 if number is prime
    int i;
    for (i = 2; i < number / 2; i++) {
        if (number % i == 0) {
            return 1;
        }
    }
    return 0;
}

但我仍然遇到同样的问题

2 个答案:

答案 0 :(得分:4)

有致命错误:

for(lower;lower<=upper; lower+2)

如果使用合适的编译器并打开所有警告,编译器会告诉您错误的原因。我会告诉你:低+ 2只是评估表达式低+ 2,没有副作用。它没有修改低级。你可能希望它增加2,它没有。

可能会有更多错误,我不再看第一个错误了。

哦,好吧,我再次查看了代码,发现了这个:

if( prime(tempL == 0 )  //after decrementing we find a prime

tempL == 0是一个比较tempL和0的表达式;如果tempL = 0则结果为1,否则为0。所以你调用prime(1)或prime(0)。在这两种情况下,prime()函数都返回0,因此永远不会执行if。

哦,我已经完成了......

你的功能&#34;素数&#34;返回错误的值。如果数字是素数,则返回0;如果数字不是,则返回1。除非数字是从0到4,否则它总是返回0.对于数字= 2或3,这是错误的,但对1和4正确...

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您不检查scanf的返回值,从而导致未定义的行为。
  • 您不会在循环lower中增加for (lower; lower <= upper; lower + 2)。写下这个:

    for (; lower <= upper; lower += 2)
    
  • 你错放了if (prime(tempL == 0)中的括号,它应该是:

    if (prime(tempL) == 0)
    
  • //

  • 之后缺少x = lower - (tempL);
  • 你的函数prime应该返回非零表示真值,零表示虚假。称之为isprime()
  • 也更具可读性

以下是更正后的版本:

#include <stdio.h>

int isprime(int number) { //returns non zero if number is prime
    for (int i = 2; i * i <= number; i++) {
        if (number % i == 0) {
            return 0;
        }
    }
    return 1;
}    

int main(void) {
    int upper, lower;

    printf("Enter lower limit: ");
    if (scanf("%d", &lower) != 1)
        return 1;

    printf("Enter upper limit: ");
    if (scanf("%d", &upper) != 1)
        return 1;

    for (int n = lower; n <= upper; n += 2) {
        for (int i = 1; i <= n / 2; i++) {
            if (isprime(i) && isprime(n - i)) {
                printf("%d = %d + %d\n", n, i, n - i);
                break;
            }
        }
    }
    return 0;
}          
相关问题