如何解决浮点异常核心转储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
。
您的代码中还有一些其他问题:
- 您在更改
n
的值后存储质因数,您需要交换这两行 - 在您的第三个循环中,
n
现在是1
,因此您只需打印第一个因子。 - 在
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。