浮点异常核心转储cpp

问题描述

嘿伙计们,我正在使用 Eratosthenes 筛法对 cpp 中给定的无“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;
}

解决方法

在这段代码中:

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

您的代码中还有一些其他问题:

  1. 您在更改 n 的值后存储质因数,您需要交换这两行
  2. 在您的第三个循环中,n 现在是 1,因此您只需打印第一个因子。
  3. 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;
}