【问题标题】:Floating point exception (core dumped) cpp浮点异常(核心转储)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 。和“这是一个等待发生的越​​界访问”你能解释一下这行吗

标签: c++ sieve-of-eratosthenes


【解决方案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

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

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

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多