嘿,这段代码有什么问题。当运行此代码时,它显示一些错误浮点异常(核心哑)。我用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;};
}
答案 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。
该算法存在其他主要问题,假设它应该得到素数因子。