#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; int steps = 20; while(a != 0 && b != 0){ steps++; int c = min(a, b); elem* v = new elem[100000000];//vector v(100000000); int counter = 0; v[c].val = 0; v[c].steps = steps; while(c != 1){ if(c%2 == 0){ c /= 2; } else{ c = 3*c + 1; } ++counter; v[c].val = counter; v[c].steps = steps; } //sort(v, &v[100000000]); 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(v[c].steps == steps){ if(v[c].val == a){ cout << a << " needs " << counter << " steps, " << b << " needs " << v[c].val << " steps, they meet at " << c << endl; } else{ cout << a << " needs " << v[c].val << " steps, " << b << " needs " << counter << " steps, they meet at " << c << endl; } cond = false; } if(c%2 == 0){ c /= 2; } else{ c = 3*c + 1; } ++counter; } cin >> a >> b; } return 0; }