SIGSEGV(信号11)FCTRL2 codechef中的“分段故障”

时间:2015-03-02 16:18:09

标签: c++ runtime-error sigsegv

我在提交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;
}

2 个答案:

答案 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失败。