#include #include int next(int n){ if(n==1) return -1; if((n%2)==0) return (n/2); return ((3*n)+1); } int main(int argc, char* argv[]){ int a, b; while(1){ scanf("%d %d", &a, &b); if(a==0 && b==0) break; int kapacita = 128; unsigned int* polea = (unsigned int*)malloc(kapacita*sizeof(*polea)); for(int i = 0; i < kapacita; i++){ polea[i] = 0; } int prvku1 = 1; polea[0] = a; while(1){ if(prvku1 == kapacita){ polea=(unsigned int*)realloc(polea, (2*kapacita*sizeof(*polea))); for(int k = kapacita; k < 2*kapacita; k++){ polea[k] = 0; } kapacita*=2; } int cislo = next(polea[(prvku1-1)]); if(cislo == -1) break; polea[(prvku1)] = cislo; prvku1++; } int kapacita2 = 128; unsigned int* poleb = (unsigned int*)malloc(kapacita2*sizeof(*poleb)); for(int i = 0; i < kapacita2; i++){ poleb[i] = 0; } int prvku2 = 1; poleb[0]=b; while(1){ if(prvku2 == kapacita2){ poleb=(unsigned int*)realloc(poleb, (2*kapacita2*sizeof(*poleb))); for(int k = kapacita2; k < 2*kapacita2; k++){ poleb[k] = 0; } kapacita2*=2; } int cislo2 = next(poleb[(prvku2-1)]); if(cislo2 == -1) break; poleb[(prvku2)] = cislo2; prvku2++; } int i=prvku1-1; int j=prvku2-1; int cnt = 0; while(polea[i] == poleb[j]){ cnt++; if(i==0 || j==0) break; i--; j--; } printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", a, (prvku1-cnt), b, (prvku2-cnt), polea[(prvku1 - cnt)]); free(polea); free(poleb); } return 0; }