首页 > 解决方案 > 找不到浮点异常

问题描述

此代码显示浮点异常。我知道为什么会发生此错误,但我无法在此代码中找到错误。

#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]<=n&&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;
    }
}

标签: c++

解决方案


一些系统报告整数除以零的浮点异常。那么您的代码如何获得其中之一呢?你除以v[i](模运算符%是一个除法)。怎么可能v[i]是零?因为您正在访问v向量的末端。

当您构造v素数列表时,您只添加小于 的数字MAX,即 10005。但是,在您的 for 循环中main,您将自己限制为更大的索引 ( i <= 100001),这是素数的计数,而不是主要。一旦你超过了结束v,你就会进入未定义的行为,这最终会导致异常。


推荐阅读