#include #include int main(){ int x,y,i,j; int c = 100; int d = 100; int next; int one1; int one2; int *pole1; int *pole2; int m; pole1 = (int*)malloc(c*sizeof(int)); pole2 = (int*)malloc(d*sizeof(int)); while(scanf("%d %d", &x, &y)){ next= 0; if(x == 0 || y == 0){ break; } if(x == y){ printf("%d needs 0 steps, %d needs 0 steps, they meet at %d\n", x, y, x); continue; } pole1[0] = x; pole2[0] = y; i = 1; j = 1; one1 = 0; one2 = 0; while(1){ if(i == c){ pole1 = (int*)realloc(pole1, 2*c*sizeof(int)); c *= 2; } if(one1==0){ if(pole1[i-1] % 2 == 0){ pole1[i] = pole1[i-1] / 2; if(pole1[i] == 1){ one1 = 1; } i++; }else{ pole1[i] = (3 * pole1[i-1]) + 1; i++; } for( m = 0; m < j; m++){ if(pole2[m] == pole1[i-1]){ printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", x, i-1, y, m, pole2[m]); next=1; break; } } if(next==1){ break; } } if(j == d){ pole2 = (int*)realloc(pole2, 2*d*sizeof(int)); d *= 2; } if(one2==0){ if(pole2[j-1] % 2 == 0){ pole2[j] = pole2[j -1] / 2; if(pole2[j] == 1){ one2 = 1; } j++; }else{ pole2[j] = (3 * pole2[j-1]) + 1; j++; } for(m = 0; m < i; m++){ if(pole1[m] == pole2[j-1]){ printf("%d needs %d steps, %d needs %d steps, they meet at %d\n", x, m, y, j-1, pole1[m]); next = 1; break; } } if(next==1){ break; } } } } free(pole1); free(pole2); return 0; }