问题是找到存在最长 collatz 序列的数字 i<=n, n<=500000。 数字 n 的 Collatz 级数终止于 1,条件为 如果 n 为偶数,则下一项 = n/2 如果 n 为奇数,则下一项 = 3*n + 1
事实上,对于所有数字,collatz 级数始终以 1 结束。
因此任何数字都不会在其 collatz 系列中重复。利用这个事实,我编写了以下代码 逻辑: 我开始一个 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/