我在提交solution codechef小因子问题代码 FCTRL2 时遇到SIGSEGV错误,尽管代码在 ideone 上正常运行 编码语言 C ++ 4.3.2 例 样本输入: 4 1 2 五 3 样本输出: 1 2 120 6
#include <iostream>
using namespace std;
void fact(int n) {
int m = 1, a[200];
for (int j = 0; j < 200; j++) {
a[j] = 0;
}
a[0] = 1;
for (int i = 1; i <= n; i++) {
int temp = 0;
for (int j = 0; j < m; j++) {
a[j] = (a[j] * i) + temp;
temp = a[j] / 10;
a[j] %= 10;
if (temp > 0) {
m++;
}
}
}
if (a[m - 1] == 0) {
m -= 1;
}
for (int l = m - 1; l >= 0; l--) {
cout << a[l];
}
}
int main() {
int i;
cin >> i;
while (i--) {
int n;
cin >> n;
fact(n);
cout << endl;
}
return 0;
}
答案 0 :(得分:1)
(使用int 计算因子的擦除代码)
代码中的问题是,每次数字乘法temp
不为0时,您都会增加m。然后,在计算大因子时,您可能会得到一个SIGSEGV,因为m
变得太大了。您可能已经看到了它,因为0显示在您的结果前面。我想这就是你添加
if (a[m - 1] == 0) {
m -= 1;
}
只有在内部循环完成且term不为null时才应增加m
。一旦修复,你可以摆脱上面的代码。
void fact(int n) {
int m = 1, a[200];
for (int j = 0; j < 200; j++) {
a[j] = 0;
}
a[0] = 1;
for (int i = 1; i <= n; i++) {
int temp = 0;
for (int j = 0; j < m; j++) {
a[j] = (a[j] * i) + temp;
temp = a[j] / 10;
a[j] %= 10;
}
// if (temp > 0) {
// a[m++] = temp;
// }
while (temp > 0)
{
a[m++] = temp%10;
temp /= 10;
}
}
for (int l = m - 1; l >= 0; l--) {
cout << a[l];
}
}
答案 1 :(得分:1)
警告我不会直接为您修改代码,但我会突出显示它出错的地方以及为什么会出现seg错误。
你的问题在于你实现了如何处理数字乘法 - 特别是你的m
值会发生什么。每次增加时输出m
来测试它 - 你会发现它比你想要的更频繁地递增。你是对的,你应该意识到你需要使用一种方法来获得158位数,你的基本概念才能发挥作用。
第一个线索是通过使用n = 6
进行测试,当你得到一个领先的0
时,即使你试图摆脱包含if
块的问题,你也不应该这样做m-=1
尝试使用n = 25
,您会看到很多的前导零。
任何大于此值的值都将失败并出现分段错误。 Seg错误是因为,出现此错误,您尝试将数组a
的值设置为超出最大索引(因为m
大于200
)
N.B。您对Ideone.com上的代码有效的断言仅在某一点上是正确的 - 它将以n > 25
失败。