Реализация гипотезы Гольдбаха в коде 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;
}
Но я все еще получаю ту же проблему
2 ответа
Есть фатальная ошибка:
for(lower;lower<=upper; lower+2)
Если вы используете достойный компилятор и включите все предупреждения, компилятор скажет вам, что не так. Вместо этого я скажу вам: более низкий +2 просто оценивает выражение более низкий +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...
В вашем коде несколько проблем:
- Вы не проверяете возвращаемое значение
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;
}