Как исправить исключение с плавающей запятой: 8 в коде C

#c #primes

#c #простые числа

Вопрос:

Я пытаюсь написать программу, в которой перечислены все простые числа в заданном параметре. Мой терминал ничего не выводит, хотя у меня есть функция печати в конце программы.

Не могли бы вы также сообщить мне, были ли необходимы переменные x и g или я мог просто придерживаться i.

Вот мой код:

 #include <stdio.h>

#define MAX_SIZE 1000
int main(){

    int N , i, x, g, a[MAX_SIZE];

    scanf("%d", amp;N);

    a[0] = 2;

    for (i = 1; i < N - 2; i  )
    {
        a[i] = (a[i-1])   1;
    }

    for (x = 0; x < N - 2; x  ){
        for (i = 1; i < N - 2; i  ){
            if (a[i] % a[x] == 0) {
                for (g = i; g < N - 2; g  ){
                    a[g] = a[g 1];
                }
            }
        }
    }


    for (i = 0; i < N - 2; i  ){
        printf("%d n", a[i]);
    }

   return 0;
}
 

Комментарии:

1. Если вы получаете исключение с плавающей запятой в коде, в котором нет математики с плавающей запятой, это может означать только одно: разделить на 0.

2. Плохо понимая алгоритм, причиной ошибки является деление на ноль a[i] % a[x] .

3. Вы должны использовать отступы, чтобы ваш код было легче читать.

Ответ №1:

Здесь у вас ошибка «один за другим»:

 for (g = i; g < N - 2; g  ){
  a[g] = a[g 1];

}
 

Когда g = N - 2 - 1 a[N - 2] используется значение, но элемент не инициализирован, и значение не определено.

Вы должны проверить и исправить свой алгоритм, чтобы не читать неинициализированный элемент.


Ваш код выглядит слишком сложным для меня. Вот пример моего кода для печати всех простых чисел, которые равны N или меньше:

 #include <stdio.h>
#include <stdlib.h>

int main(void) {
    int N;
    int* primes;
    int prime_count;
    int i, j;
    if (scanf("%d", amp;N) != 1) return 1;
    primes = malloc(sizeof(*primes) * N);
    if (primes == NULL) return 2;

    prime_count = 0;
    for (i = 2; i <= N; i  ) {
        int is_prime = 1;
        for (j = 0; j < prime_count; j  ) {
            if (i % primes[j] == 0) {
                is_prime = 0;
                break;
            }
        }
        if (is_prime) primes[prime_count  ] = i;
    }

    for (i = 0; i < prime_count; i  ) {
        printf("%dn", primes[i]);
    }

    free(primes);
    return 0;
}
 

Комментарии:

1. Но не позволяет g = i присваивать g значение? Я думаю, вы все равно имеете в виду g, я только новичок XD

2. @ChrisThomas Это дает g значение, но не дает a[N-2] значения.

3. На каком этапе мне назначить позицию массива N — 2? Кроме того, причина, по которой мне нужно использовать эту версию кода, заключается в том, что мой лектор указал, как должен работать наш алгоритм

4. @ChrisThomas Я предполагаю, что элемент не должен быть назначен, а условие g < N - 2 должно быть заменено на g 1 < N - 2 .

5. @ChrisThomas g Цикл удаляет элемент из массива. После удаления элемента массив становится короче на 1 и N должен быть соответствующим образом скорректирован.