Как заметил @bruno в своем ответе, вы превышаете емкость типа данных int
вашей системы. Эта проблема даже намекает на то, что это проблема, с которой вы можете столкнуться, когда она говорит:
ПРИМЕЧАНИЕ. После запуска цепочки допускается go свыше миллиона.
Сколько выше? Это не ясно из проблемы, поэтому "как я могу определить, какой тип данных будет достаточно?" это вопрос, который должен сразу же прийти на ум. Конечно, предыдущий вопрос "какой тип данных мне выбрать?" это тот, который всегда должен получить хотя бы несколько минут неподдельного внимания.
При условии отсутствия предварительного знания последовательностей, которые вы намереваетесь вычислить, и отсутствия четкого способа определения надежных верхних границ для их элементы в общем случае, определение того, какой тип данных будет достаточным, требует фактического выполнения (попытки) вычисления и отслеживания переполнения. В качестве альтернативы, вы можете сформулировать это, выбрав тип данных, который, по вашему мнению, будет достаточным, и подтвердите, что, на самом деле, go достаточно. Если это не так, попробуйте еще раз с другим типом данных.
В этом случае легко избежать переполнения. Единственная переменная, которая требует наблюдения - это temp
, и ее значение увеличивается только при вычислении temp =(3*temp)+1
. Вы знаете, каково максимальное значение типа int
(INT_MAX
), и просто алгебраически определить максимальное значение temp
, для которого это вычисление не превышает INT_MAX
: это (INT_MAX - 1) / 3
. Таким образом, вы можете сделать это:
#include <assert.h>
#define TEMP_BOUND ((INT_MAX - 1) / 3)
// ...
if(temp % 2 == 0) {
temp /= 2;
} else {
assert(temp <= TEMP_BOUND);
temp = (3 * temp) + 1;
}
Если в результате вы получите ошибку подтверждения (как при использовании типа int
), вы можете повторить попытку с типом данных, который поддерживает большее максимальное значение ; просто убедитесь, что обновили макрос TEMP BOUND
соответствующим образом для нового типа данных.
Я также должен заметить, что существует альтернатива выполнения ваших вычислений с типом данных произвольной точности, например, доступным из различные сторонние библиотеки (например, GMP). Это будет на намного медленнее, однако, и код будет более сложным, поэтому для такого случая я рекомендую вместо этого метод проб и ошибок, описанный выше, по крайней мере, до такой степени, что вы определите, что для этой проблемы недостаточно встроенного типа данных.