【问题标题】:Collatz sequence of a number [duplicate]一个数字的Collat​​z序列[重复]
【发布时间】:2013-08-31 02:27:57
【问题描述】:

我正在尝试查找数字的 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;
}

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

【问题讨论】:

  • 做欧拉项目:)
  • @Kamiccolo 在某个点越过 INT_MAX。感谢您的帮助。
  • long number 更改为unsingned long 可能会解决这个问题。因为collatz(113383) 产生的链中的最大数字超过了 2^31-1(有符号长)限制。 long 的默认类型(有符号,使用)因编译器而异。
  • @Kamiccolo:不是这样——除非出现大错误,long 在任何 C 或 C++ 编译器上总是完全等同于 signed long
  • @JerryCoffin,哎呀,对不起,我的错误。深夜想int和写longs是不好的:)

标签: c collatz


【解决方案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 位中,它也应该足够大来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多