c - 为什么代码会抛出段错误?

标签 c arrays segmentation-fault collatz

问题是找到存在最长 collat​​z 序列的数字 i<=n, n<=500000。 数字 n 的 Collat​​z 级数终止于 1,条件为 如果 n 为偶数,则下一项 = n/2 如果 n 为奇数,则下一项 = 3*n + 1

事实上,对于所有数字,collat​​z 级数始终以 1 结束。

因此任何数字都不会在其 collat​​z 系列中重复。利用这个事实,我编写了以下代码 逻辑: 我开始一个 while 循环,直到 n 为止,对于每次迭代,我存储该 i 的序列长度。 如果 i 出现在某个 n >= r > i 的序列中,则 i 终止循环并将 i 的长度添加到 r 中。 例如,假设系列 3 是 3, 10, 5, 16, 8, 4, 2, 1。现在 2 对应的长度已经存储在 series_length 数组中,所以我使用该值。

然后旁边的 for 循环找到最长的系列并显示答案。

准确地说,代码在 n <= 1818 时工作正常,但显示段错误(不知道为什么:()。请帮忙

代码:

#include <stdio.h>

int length = 0, series_length[500000], maxlength = 0;

void store_length(int n) {
    while(n > 1 && series_length[n] == 0) {
        length++;
        if(n%2 == 0) {
            n = n/2;
        }
        else {
            n = 3*n + 1;
        }
    }
    length += series_length[n];
}

int main() {
    int n, i = 1, result;
    scanf("%d", &n);
    series_length[1] = 1;//redundant statement

    while(i <= n) {
        store_length(i);
        series_length[i] = length;
        length = 0;
        i++;
    }

    for(int i = 1;i <= n; i++) {
        if(maxlength <= series_length[i]) {
            maxlength = series_length[i];
            result = i;
        }
    }

    printf("%d %d\n", result, maxlength);

    return 0;
}

输入- 10 输出- 9 20(如预期)

输入- 100000 输出- 分段故障 预期的- 77031 351

最佳答案

您的 n 值超出了范围。

函数store_length中有一行n = 3*n + 1;

使用 gdb 运行此程序,输入为 100000 给出

 Thread 1 received signal SIGSEGV, Segmentation fault.
 0x0000000000401545 in store_length (n=532060) at 29_01.c:6
6           while(n > 1 && series_length[n] == 0) {
(gdb) p n
$1 = 532060

关于c - 为什么代码会抛出段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59962246/

相关文章:

C Buffer 中的控制字符

c++ - 组织跨平台的C/C++项目

c - 为什么这个程序会崩溃?

c - 我们需要比较 C 中数组的每个元素吗?

c - 在 C 中返回 int 数组

python - 使用 Xlsxwriter 和 PyQt4 时出现段错误

python - 使用 ctypes 和 SSE/AVX 有时会出现段错误

c - 该函数损坏了我在 C 中的数组

javascript - Javascript 中的数组元素与 Json 响应的比较

python - PySide 关机时出现段错误