2015-02-20 3 views
3
#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; 
} 

Это то, что я до сих пор ... все это делает бесконечно печататьОСУЩЕСТВЛЕНИЮ Гольдбаха в C код

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; 
} 

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

+0

нормально, дайте мне попробовать это – Superman

+0

Ваш 'штриха()' функция будет работать более чем в два раза быстрее с ' s = (целое) SQRT (число); для (i = 3; i <= s; i + = 2) ', отменив« число == 1 »и« число == 2 ». –

+0

Здесь есть несколько проблем. Для одного, пожалуйста, измените цикл «for»: 'for (; lower <= upper; lower + = 2) {...}' – FoggyDay

ответ

4

Существует фатальная ошибка:

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 никогда не выполняется.

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

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

+0

Согласитесь, что «используйте достойный компилятор и включите все предупреждения». – chux

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; 
}   
Смежные вопросы