0

我试图找到一个数字的 Collat​​z 序列。以下代码运行到数字 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;
}

编辑:Collat​​z 猜想说如果数字是偶数,则序列中的下一个数字是 n/2 如果数字是奇数,则 3n+1 如果数字是 1,则终止

4

1 回答 1

1

您没有检查数字是否溢出您的long. 尝试在循环中添加以下打印:

...
      if (number*3+1 < number) {
        printf("overflow after %d iterations\n", length);
        break;
      }
      number = (number * 3) + 1;
...

请注意,这是否溢出 along将取决于系统/目标:

/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>

即使在 32 位中,您也可以考虑使用unsigned long long对于这个问题应该足够大的 a。

于 2013-08-31T02:48:37.383 回答