Collat​​z序列的一个数字

时间:2013-08-31 02:27:57

标签: c collatz

我正在尝试找到一个数字的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,则终止

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位中也应该足够大,以解决此问题。