#include #include #include #include #define LINE_LENGTH 1024 #define MAX 4000000 #define EMPTY(x) ((x) == 0xFFFFFFFFu) #define NEXT(x) (0 == ((x) % 2) ? (x) / 2 : (x) * 3 + 1) void doit(unsigned int a, unsigned int b) { unsigned int xa, xb, sa, sb, c; unsigned int *seqa, *seqb; seqa = (unsigned int *)malloc(sizeof(unsigned int) * MAX); seqb = (unsigned int *)malloc(sizeof(unsigned int) * MAX); memset((void *)seqa, 0xFF, sizeof(unsigned int) * MAX); memset((void *)seqb, 0xFF, sizeof(unsigned int) * MAX); xa = a; xb = b; sa = 0; sb = 0; while (true) { seqa[xa] = sa; seqb[xb] = sb; if (!EMPTY(seqa[xb]) || !EMPTY(seqb[xa])) break; sa++; sb++; xa = NEXT(xa); xb = NEXT(xb); } if (!EMPTY(seqa[xb])) { sa = seqa[xb]; c = xb; } else if (!EMPTY(seqb[xa])) { sb = seqb[xa]; c = xa; } printf("%u needs %u steps, %u needs %u steps, they meet at %u\n", a, sa, b, sb, c); } int main(int argc, char *argv[]) { char line[LINE_LENGTH]; unsigned int a, b; argc = argc; argv = argv; while (true) { fgets(line, LINE_LENGTH, stdin); sscanf(line, "%u %u", &a, &b); if (0 == a && 0 == b) break; doit(a, b); } return 0; }