我在试着找一个数字的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猜想说,如果number是偶数,则序列中的下一个数字是n/2;如果number是奇数,则3n+1;如果number是1,则终止
发布于 2013-08-31 10:48:37
您没有检查该数字是否已溢出您的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位的情况下也可以解决此问题。
https://stackoverflow.com/questions/18543885
复制相似问题