#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
, вы попадаете в неопределенное поведение, которое в конечном итоге приводит к исключению.