c ++:浮点异常(核心转储)

时间:2016-02-14 16:04:16

标签: c++ exception point floating

嘿,这段代码有什么问题。当运行此代码时,它显示一些错误浮点异常(核心哑)。我用g ++来编译这个程序。

#include <iostream>
using namespace std;

int checkprime(int num){
int ch=0;
for (int n=2;n<num;n++){ 
    if (num%n==0){ ch=ch+1 ;}}
if (ch==0){return num;}
else{return -1; }
}


int main(){
int prt=0;int a=2;long long int pri=600851475143;int arr_pr_fac[100];
int re;
while(a<pri){
    a++;
    if (pri%a==0){ re=checkprime(a) ;
        if (re>0){arr_pr_fac[prt]=re;prt++;cout<<re<<endl;}

    }
}
for(int th=0;th<4;th++){cout<<arr_pr_fac[th]<<endl;};
}

3 个答案:

答案 0 :(得分:1)

这是一个问题:

    int a = 2; long long int pri = 600851475143;
    // ...
    while (a < pri) {
    a++;
    if (pri%a == 0) {  // <-- a will be 0 at some point

由于您正在递增a,因此a只是一个签名的int,而pri是一个更大的整数类型,它最终将回绕到0( long long)。一旦发生这种情况,取模数为0将产生除零误差(这是未定义的行为)。

此外,您的while循环永远不会终止,因为a < pri始终为true。 (不可否认,如果pri的值很大,那么循环会运行很长时间,几乎就好像它不会终止一样。)

更正是您应该使a以及可能所有的int类型(变量,函数的返回类型,数组类型等)long long来避免这种情况以及可能的其他溢出错误。

答案 1 :(得分:0)

当您声明 long long int pri = 600851475143 时。 我们将值分配给 a pri 。高达a = 32767一切正常。但在它变为零而不是a = 32768之后。因此在声明中 if(pri%a == 0)当a = 0时出现浮点异常。 sol:将 a 声明为long long int。

答案 2 :(得分:-1)

可能是阵列溢出。也许使用std :: vector。

该算法存在其他主要问题,假设它应该得到素数因子。