2015-08-04 3 views
2

Я пытаюсь вычислить все простые числа от 0 до 100, и я получаю исключение с плавающей точкой, может ли кто-нибудь сказать мне, почему? (Если это помогает, я использую gcc)Почему я получаю «Исключение с плавающей запятой: 8»

#include <stdio.h> 

int main(void) 
{ 
    int nums[100], i; 

    for(i=0;i<100;i++) 
    nums[i] = i; 

    int j,k,l,z; 

    for(i=1;i<100;i++) 
    for(j=2;j<100;j++) 
     if((nums[i] % nums[j]) == 0) 
     { 
     nums[j] = 0; 
     } 

    for(i=0;i<100;i++) 
    if(nums[i] != 0) 
     break; 

    for(z=0;z<100;z++) 
    { 
     for(k=i;k<100;k++) 
     for(l = (k+2);l < 100;l++) 
     if((nums[k] % nums[l]) == 0) 
      nums[k] = 0; 
    } 

    for(i=0;i<100;i++) 
    if(nums[i] != 0) 
     printf("%d,",nums[i]); 

    printf("\n"); 

    return 0; 
} 
+0

Это очень плохой способ генерации простых чисел. Используйте [Сито Эратосфена] (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes) вместо –

ответ

5

Ну, это действительно сложно понять, что делает ваш код. Но все-таки

for(i=1;i<100;i++) 
    for(j=2;j<100;j++) 
     if((nums[i] % nums[j]) == 0) 
     { 
      nums[j] = 0; 
     } 

После этого, многие ценности nums будет 0. (Вы можете распечатать и проверить)

Итак, Позже, когда вы делаете

for(z=0;z<100;z++) 
{ 
    for(k=i;k<100;k++) 
    for(l = (k+2);l < 100;l++) 
    if((nums[k] % nums[l]) == 0) //Part where division by 0 occurs 
     nums[k] = 0; 
} 

Там будет разделение на 0, что дает floating point exception

Отредактировано

Infact, будет в первых двух for петель только .. Когда i=2 и j=2, nums[2] будут обновлены, чтобы оценить 0floating point exception. Затем позже, когда для i=4 и j=2. Будет division by 0, потому что num[2] уже 0, что вызывает floating point exception

+0

Спасибо, вы очень! Это очень помогает, я его пересматриваю. –

+0

Он сбой в первом фрагменте кода для 'i = 4' и' j = 2', потому что 'nums [2]' будет установлен в '0', когда' i = 2' и 'j = 2'. Таким образом, второй фрагмент кода не будет достигнут. – mch

Смежные вопросы