浮点异常(核心转储)cpp
Posted
技术标签:
【中文标题】浮点异常(核心转储)cpp【英文标题】:Floating point exception (core dumped) cpp 【发布时间】:2020-12-19 07:16:37 【问题描述】:大家好,我在 cpp 中使用 Eratosthenes 筛对给定的无“n”进行质数分解,但它显示错误:
“浮点异常(核心转储)”
代码如下:-
#include <iostream>
using namespace std;
void primeFactor(int n)
int arr[100] = 0;
for (int i = 2; i < n; i++)
if (arr[i] == 0)
for (int k = i * i; k <= n; k = k + i)
arr[k] = i;
int primeFactors[n] = 0;
for (int i = 0; n > 1; i++)
n = n / arr[n];
primeFactors[i] = arr[n];
for (int i = 0; i < n; i++)
cout << primeFactors[i];
int main(int argc, char const *argv[])
int n;
cin >> n;
primeFactor(n);
return 0;
【问题讨论】:
你尝试过什么n
? if (arr[i] == 0)
这是一个等待发生的越界访问,以后还会有更多。
for (int k = i * i; k <= n; k = k + i)
??对于k == n
,您也超出了k >= 100
的范围。
int primeFactors[n]
不是有效的 c++,请改用 std::vector
。您的崩溃可能是由 arr[n]
之一为零引起的除以零错误
int k = i
而不是 int k = i * i
可能会修复崩溃,但我不确定即使使用此修复程序您的算法也能正常工作
@dxiv 我试过 8 和 21 。和“这是一个等待发生的越界访问”你能解释一下这行吗
【参考方案1】:
在这段代码中:
if (arr[i] == 0)
for (int k = i * i; k <= n; k = k + i)
arr[k] = i;
您从未设置过arr[i]
,因此arr[i]
中的所有素数都设置为0
,从而导致第二个循环中出现除以零异常。 k
的初始值应该是i
而不是i * i
。
您的代码中还有一些其他问题:
-
你在改变
n
的值后存储质数,你需要交换这两行
在您的第三个循环中,n
现在是 1
,因此您只需要打印第一个因素。
in int primeFactors[n]
n
不是编译时间常数,因此这不是有效的 c++ 并且仅由于 GCC 扩展而编译,使用 std::vector
会更好,也有助于解决问题 2。
这是您的代码的工作版本:
#include <iostream>
#include <vector>
using namespace std;
void primeFactor(int n)
int arr[100] = 0 ;
for (int i = 2; i < n; i++)
if (arr[i] == 0)
for (int k = i; k <= n; k = k + i)
arr[k] = i;
std::vector<int> primeFactors;
while (n > 1)
primeFactors.push_back(arr[n]);
n = n / arr[n];
for (int f : primeFactors)
cout << f << ", ";
int main(int argc, char const* argv[])
int n = 28;
primeFactor(n);
return 0;
【讨论】:
以上是关于浮点异常(核心转储)cpp的主要内容,如果未能解决你的问题,请参考以下文章