#include #include #include #define MAXN 45 static unsigned long long fibs[MAXN]; static unsigned long long decode (const char *src) { unsigned long long val; size_t i, len; val = 0; len = strlen (src); for (i = 0; i < len; i++) { if (src[len - i - 1] == '1') val += fibs[i]; } return val; } static void encode (char *buf, unsigned long long val) { size_t i; if (val == 0) { strcpy (buf, "0"); return; } for (i = MAXN - 1; val < fibs[i]; i--) ; do { if (val >= fibs[i]) { *buf++ = '1'; val -= fibs[i]; } else *buf++ = '0'; } while (i-- != 0); *buf = 0; } static void repeat (unsigned n, char c) { while (n != 0) { n--; putchar (c); } } int main (void) { size_t i; fibs[0] = 1; fibs[1] = 2; for (i = 2; i < MAXN; i++) fibs[i] = fibs[i - 1] + fibs[i - 2]; for (;;) { char src1[1024], src2[1024], dest[1024]; unsigned long long v1, v2; size_t ld; if (scanf (" %s%s", src1, src2) != 2) break; v1 = decode (src1); v2 = decode (src2); encode (src1, v1); encode (src2, v2); encode (dest, v1 + v2); ld = strlen (dest); repeat (ld - strlen (src1) + 2, ' '); puts (src1); putchar ('+'); repeat (ld - strlen (src2) + 1, ' '); puts (src2); fputs (" ", stdout); repeat (strlen (dest), '-'); fputs ("\n ", stdout); puts (dest); } return EXIT_SUCCESS; }