2013-08-31 2 views
0

Я пытаюсь найти последовательность Collatz числа. Следующий код работает в бесконечном цикле для номера 113383.Последовательность Collatz числа

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; 
} 

РЕДАКТИРОВАТЬ: гипотеза коллатца Говорит следующее число в последовательности п/2, если число четное 3n + 1, если число является нечетным если номер равен 1

+1

Выполнение проекта Euler :) – aaronman

+1

@ Kamiccolo пересекала INT_MAX в точке. Спасибо за помощь. – SureshS

+0

Изменение 'long number' на' unsingned long' может исправить это. Поскольку наибольшее количество в цепочке, созданное 'collatz (113383)', превышает 2^31-1 (подписанный длинный) предел. И тип по умолчанию (подписанный, используемый) длинный изменяется между компиляторами. – Kamiccolo

ответ

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-битной.

Смежные вопросы