我正在尝试找到一个数字的Collatz序列。以下代码对数字113383进行无限循环。
int collatz(long number) {
int length = 1; //length of the sequence
while (number != 1) {
printf("%ld-", number);
if ((number % 2) == 0)
number /= 2;
else
number = (number * 3) + 1;
length++;
}
return length;
}
int main() {
printf("%d", collatz(113383));
return 0;
}
编辑: Collatz猜想说 顺序的下一个数字是 n / 2如果数字是偶数 如果数字为奇数,则为3n + 1 如果数字是1,则终止
答案 0 :(得分:1)
您没有检查该号码是否溢出long
。尝试在循环中添加以下打印:
...
if (number*3+1 < number) {
printf("overflow after %d iterations\n", length);
break;
}
number = (number * 3) + 1;
...
请注意,这是否溢出long
取决于系统/目标:
/tmp/c $ gcc -o collatz -m32 collatz.c
/tmp/c $ ./collatz
overflow after 120 iterations
/tmp/c $ gcc -o collatz -m64 collatz.c
/tmp/c $ ./collatz
<answer redacted>
您也可以考虑使用unsigned long long
,即使在32位中也应该足够大,以解决此问题。