C: "Исключение с плавающей точкой" в коде, который не содержит чисел с плавающей точкой

В этом коде:

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

int main (int argc, char ** argv) {
    uint64_t bignum = 600851475143;
    int is_prime = 0;
    uint64_t result = 0;
    uint64_t i = 0;
    uint64_t j = 0;

    for (i = 0; i < bignum; i++) {
        if (bignum % i == 0) {
            is_prime = 1;
            for (j = 0; j < i; j++) {
                if (i % j == 0) {
                    is_prime = 0;
                    break;
                }
            }
            if (is_prime) {
                result = i;
            }
        }
    }

    printf("The largest prime factor of the number %lu is %lu.\n", bignum, result);

}

при компиляции с:

$ gcc -Wall -g 3.c -o 3 -lm

Я получаю "исключение с плавающей запятой" при запуске результирующего исполняемого файла. В коде нет чисел с плавающей запятой. Что здесь не так, и что мне нужно сделать, чтобы решить проблему?

2 ответа

Решение

Деление на 0 считается "исключением с плавающей запятой". Не спрашивай меня почему.

Вы делите на 0 по крайней мере в двух местах. Обратите внимание, что оператор по модулю % считается разделением.

На первой итерации цикла i 0, так bignum % i деление на 0, что вызывает исключение с плавающей запятой. То же самое происходит с j в вашем внутреннем цикле.

Поскольку вы проверяете на простоту, деление на 0 или на 1 не имеет смысла, поэтому начните с 2. Кроме того, вы должны остановиться на sqrt(bignum),

uint64_t limit = sqrt(bignum);
for (i = 2; i < limit; i++) {
    ...
    for (j = 2; j < i; j++) {
Другие вопросы по тегам