Не удается найти исключение с плавающей запятой

#c

#c

Вопрос:

Этот код показывает исключение с плавающей запятой. Я знаю, почему возникает эта ошибка, но я не могу найти ошибку в этом коде.

 #include<bits/stdc  .h>

using namespace std;

typedef long long int ll;
#define MAX 10005

vector<int> build_sieve() {
    bool arr[MAX];
    for(int i=2;i<=MAX-1;i  ) {
        arr[i]=true;
    }

    arr[0]=false;
    arr[1]=false;
    for(int i=2;i*i<=MAX-1;i  ) {
        if(arr[i]==true){
            for(int j=i*i;j<=MAX-1;j=j i) {
                arr[j]=false;
            }
        }
    }

    vector<int>  v;
    for(int i=2;i<=MAX-1;i  ) {
        if(arr[i]==true){
            v.push_back(i);
        }
    }
    return v;
}

int main() {
    // int t;
    // cin>>t;
    vector<int> v =  build_sieve();
    cout<<"Prime no.s"<<endl;
    for(auto i = v.begin();i!=v.end();i  ) {
        cout<<*i<<" ";
    }

    int t;
    cin>>t;
    while(t--) {
        int n,len;
        cin>>n>>len;
        ll arr[len];
        for(int i=0;i<=len-1;i  ) {
            cin>>arr[i];
        }
        set<ll> s;
        for(int i=0;v[i]<=namp;amp;i<=100001;i  ) {
            for(int j=0;j<=len-1;j  ) {
                if((arr[j]%v[i])==0) {
                    s.insert(v[i]);
                    cout<<v[i]<<" "<<arr[j]/v[i]<<endl;
                    s.insert(arr[j]/v[i]);
                }
            }
        }
        cout<<s.size()<<endl;
    }
}
  

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

1. Вы говорите, что этот код «имеет исключение с плавающей запятой», но я не вижу, чтобы float / double где-либо использовался, поэтому я нахожу это крайне маловероятным. (Также имена переменных, такие как s, n, t, v, arr, затрудняют понимание кода, чем это необходимо)

2. ll arr[len]; массивы переменной длины являются нестандартным расширением C (т. Е. этот код не переносится между компиляторами)

3. В этом коде n = номер ввода, len = количество промежуточных чисел, мне просто нужно найти все простые числа, которые меньше n и которые делят любое из len-чисел промежуточных чисел.

4. это не проблема, потому что для других программ работает массив переменной длины. Я использую ubuntu 18.04 LTs

5. @KundanKumar — некоторые компиляторы поддерживают VLAS как нестандартное расширение в C . Даже если это работает для вашего компилятора, использовать их — действительно плохая идея — они плохо сочетаются с другими функциями C , они не будут работать со всеми компиляторами C , а стандартная библиотека C предоставляет альтернативы, которые лучше работают на C , чем VLA.

Ответ №1:

Некоторые системы сообщают об исключении с плавающей запятой при делении целого числа на ноль. Итак, как ваш код может получить одно из них? Вы делите на v[i] (оператор по модулю % — это деление). Как v[i] может быть нулевым? Потому что вы обращаетесь к концам v вектора.

Когда вы создаете v свой список простых чисел, вы добавляете только числа, меньшие MAX , то есть 10005. Однако в вашем цикле for в main вы ограничиваете себя гораздо большими индексами ( i <= 100001 ), которые являются количеством простых чисел, а не простым числом. Как только вы пройдете конец v , вы попадаете в неопределенное поведение, которое в конечном итоге приводит к исключению.