Последовательность Коллатца числа
Я пытаюсь найти последовательность Коллатца для числа. Следующий код запускается в бесконечный цикл для номера 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
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-разрядной версии.