#include #include #include #include using namespace std; struct elem{ int val; int steps; bool operator<(const elem& e)const{ return val < e.val; } bool operator==(const elem& e)const{ return val == e.val; } }; int main(){ int a, b; cin >> a >> b; while(a != 0 && b != 0){ int c = min(a, b); vector v(10000); int counter = 0; v[counter].val = c; v[counter].steps = counter; while(c != 1){ if(c%2 == 0){ c /= 2; } else{ c = 3*c + 1; } ++counter; v[counter].val = c; v[counter].steps = counter; } sort(v.begin(), v.end()); c = max(a, b); bool cond = true; counter = 0; while(c != 1 && cond){ /* for(unsigned int i = 0; i < v.size(); ++i){ if(v[i].val == c){ if(v[0].val == a){ cout << a << " needs " << v[i].steps << " steps, " << b << " needs " << counter << " steps, they meet at " << v[i].val << endl; } else{ cout << a << " needs " << counter << " steps, " << b << " needs " << v[i].steps << " steps, they meet at " << v[i].val << endl; } cond = false; break; } } */ elem e; e.val = c; vector::iterator low = lower_bound(v.begin(), v.end(), e); if(low->val == c && low != v.end()){ if(v[0].val == a){ cout << a << " needs " << counter << " steps, " << b << " needs " << low->steps << " steps, they meet at " << low->val << endl; } else{ cout << a << " needs " << low->steps << " steps, " << b << " needs " << counter << " steps, they meet at " << low->val << endl; } cond = false; } if(c%2 == 0){ c /= 2; } else{ c = 3*c + 1; } ++counter; } cin >> a >> b; } return 0; }