long c_n(long n, long p) {
while (n--)
p = (p%2?3*p+1:p/2);
return p;
}
Ogólnie to coś takiego może wyjść poza zakres int'a (to samo co long), więc nie zawsze zwróci dobry wynik.
Wersja bardziej czytelna i lepsza (choc nie idealna):
typedef unsigned long long ull;
ull c_n( int n, ull p ) {
while ( n-- ) {
if ( p % 2 == 0 )
p /= 2;
else
p = 3 * p + 1;
}
return p;
}
Korzysta z zmiennej o większym zakresie, ale nadal może dawać złe wyniki (tylko juz z baaardzo małą szansą na błąd)