Реализация гипотезы Гольдбаха в коде C

#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 часов.

Я пытаюсь использовать гипотезу Гольдбаха, чтобы распечатать числа как суммы простых чисел. Как только он напечатает число 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;
}

Но я все еще получаю ту же проблему


person Superman    schedule 20.02.2015    source источник
comment
Ваша функция prime() будет работать более чем в два раза быстрее, если s=(int)sqrt(number); for(i=3; i<=s; i+=2) отсеет number==1 и number==2.   -  person Weather Vane    schedule 20.02.2015
comment
Здесь есть несколько проблем. Во-первых, измените цикл for: for ( ; lower <= upper; lower+=2) { ...}   -  person FoggyDay    schedule 20.02.2015


Ответы (2)


Произошла фатальная ошибка:

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

Если вы используете приличный компилятор и включите все предупреждения, компилятор сообщит вам, что не так. Вместо этого я скажу вам: lower+2 просто оценивает выражение lower+2, которое не имеет побочных эффектов. Он не изменяется ниже. Вы, вероятно, хотели, чтобы он увеличился на 2 меньше, но этого не происходит.

Ошибок может быть и больше, я остановился на первой.

Ну что ж, я снова посмотрел на код и нашел это:

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

tempL == 0 — это выражение, которое сравнивает tempL и 0; результат равен 1, если tempL = 0, и 0 в противном случае. Таким образом, вы называете либо простое (1), либо простое (0). В обоих случаях функция prime() возвращает 0, поэтому if никогда не выполняется.

О, я снова сделал это...

Ваша функция "prime" возвращает точно неправильное значение. Он возвращает 0, если число простое, и 1, если нет. За исключением числа от 0 до 4, где всегда возвращается 0. Что неверно для числа = 2 или 3, но правильно для 1 и 4...

person gnasher729    schedule 20.02.2015
comment
Согласитесь с использованием приличного компилятора и включите все предупреждения. - person chux - Reinstate Monica; 20.02.2015

В вашем коде есть несколько проблем:

  • Вы не проверяете возвращаемое значение 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;
}          
person chqrlie    schedule 18.02.2017