#include #include #include bool three_en(vector& n) { int carry = 0; // carry or borrow if ( 0 == n[0]%2) // n <- n/2 div by 2 for (int i = 39; i >= 0; --i) { int d = (carry*10 + n[i]); n[i] = d/2; carry = d%2; } else // n <- 3n+1 for (int i = 0; i < 40; ++i) { n[i] = carry + 3*n[i] + (i == 0 ? 1 : 0 ); carry = n[i]/10; n[i] = n[i]%10; } // for (int j = 39; j >= 0; --j) cerr << n[j]; // cerr << endl; return carry != 0; } bool isOne(vector n) { bool ans = (n[0] == 1); for (int i = 1; ans && i < 40; ++i) ans = ( ans && n[i] == 0 ); return ans; } main() { vector n(40); while (!cin.eof()) { char d = cin.get(); if (d == '0') break; int i; // get number for (i = 0; '0' <= d && d <= '9' ; ++i) { n[i] = d - '0'; cout.put(d); d = cin.get();} reverse(n.begin(), n.begin() + i); for ( ; i < 40; ++i) n[i] = 0; // count bool over; for (i = 0; ! isOne(n) && !(over = three_en(n)); ++i); if (over) cout << " terms get too big" << endl; else cout << " " << i << endl; } }