浮点异常(核心转储)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;

【问题讨论】:

你尝试过什么nif (arr[i] == 0) 这是一个等待发生的越​​界访问,以后还会有更多。 for (int k = i * i; k &lt;= n; k = k + i) ??对于k == n,您也超出了k &gt;= 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“浮点异常(核心转储)”?

浮点异常(核心转储)非常奇怪

为 Linux 创建 C 程序时出现浮点异常(核心转储)

线性同余生成器的浮点异常(核心转储)

在汇编中进行除法时出现浮点异常(核心转储)

Vigenere.c CS50 浮点异常(核心转储)