Исключение с плавающей запятой при попытке найти простые числа

У меня есть программа, которая генерирует простые числа. Этот код отлично работает, когда мне нужны первые 100 и 200 простых чисел, но выдает исключение с плавающей запятой всякий раз, когда я использую значение выше 300 для общего числа. Проблема похоже в массиве, но я не понимаю, что происходит.

#include<stdio.h>

int main()
{
    int total = 500;
    int primes[total];
    primes[0] = 2;
    int max = 1;
    int current = 3;
    int index = 0;
    printf("%d\n",2);
    while(max != total)
    {
        for(index = 0; index <= max + 1; index++)
        {
            if(index == max + 1){
                primes[index] = current;
                printf("%d\n",current);
                max = max + 1;
                current = current + 1;
                break;
            } else {
                if(current % primes[index] == 0){
                    current = current + 1;
                    break;
                }
            }
        }
    }
}

person user1445218    schedule 04.09.2014    source источник
comment
Никогда не говорите, что код работает нормально.   -  person Kerrek SB    schedule 05.09.2014
comment
index <= max + 1 и index == max + 1 неправильно.   -  person BLUEPIXY    schedule 05.09.2014
comment
Небольшие советы по производительности: current = current + 2; подходит, так как все четные числа точно не простые; И вы можете заменить if (index == max + 1) чем-то вроде if (index == max + 1 || primes[index] * primes[index] > current).   -  person FreeNickname    schedule 05.09.2014
comment
Первый раз в цикле for() index изменяется от 0 до 2. Когда index == 1 выполняется, if(current % primes[1] == 0). primes[1] никогда не инициализировался.   -  person chux - Reinstate Monica    schedule 05.09.2014


Ответы (2)


Вы должны гарантировать, что выражение current % primes[index] никогда не оценивается со значением 0 для primes[index]. Значение 0 в качестве правого операнда оператора % вызывает неопределенное поведение в C.

person ouah    schedule 04.09.2014
comment
Когда я запускаю его код, настраивая массив так, чтобы он был на +1 больше, чем общее значение ошибки на 1 в массиве, а общее значение составляет всего 500, этого никогда не происходит, может ли он отредактировать свой код, чтобы учесть эту ошибку - person Steve; 05.09.2014
comment
@Steve, когда index == 1 вычисляется выражение current % primes[index], но primes[1] не инициализируется, поэтому, если значение оказывается 0, он получает деление на 0. В вашей системе у вас могло быть другое неинициализированное значение для primes[1]. Простой способ решить эту проблему — добавить что-то вроде primes[1] = 3; вверху программы. - person ouah; 05.09.2014

введите здесь описание изображения

ваш доступ за пределами конца простых чисел [], в отладчике вы пишете простые числа [индекс], где индекс == 500.. простые числа [500] не существуют

person Steve    schedule 04.09.2014
comment
Я знаю, что вы хотите приукрасить мой ответ, но подумайте об этом, вы портите свою память, читаете из потенциально поврежденной памяти и выполняете вычисления на ней, что вызывает ваше исключение FP. попробуйте: int total = 501; int primes[500]; и посмотрите - person Steve; 05.09.2014