Последовательность Коллатца числа

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

Другие вопросы по тегам