#include #include class Number { public: int n; char d[1000]; }; char *findOperator(char *p) { while (*p >= '0' && *p <= '9') p++; return p; } void ReadNumber(char *p, Number &a) { char *r = p; while (*r) r++; a.n = r - p; if (a.n == 1 && *p == '0') { a.n = 0; return; } for (int i = 0; i < a.n; i++) a.d[a.n - 1 - i] = *p++ - '0'; } void Add(Number& a, Number& b, Number& c, int bShift = 0) { int i = 0, carry = 0; while (i < a.n || i < (b.n + bShift) || carry > 0) { if (i < a.n) carry += a.d[i]; if (bShift <= i && i < (bShift + b.n)) carry += b.d[i - bShift]; c.d[i] = carry % 10; carry /= 10; i++; } c.n = i; } void Subtract(Number& a, Number& b, Number& c) { int i = 0, carry = 0; while (i < a.n) { if (i < b.n) carry += b.d[i]; int j = a.d[i] - carry; if (j < 0) c.d[i] = j + 10, carry = 1; else c.d[i] = j, carry = 0; i++; } while (i > 0) if (c.d[i - 1] != 0) break; else i--; c.n = i; } void Multiply(Number& a, int b, Number &c) { if (b == 0) { c.n = 0; return; } int i = 0, carry = 0; while (i < a.n || carry > 0) { if (i < a.n) carry += b * a.d[i]; c.d[i] = carry % 10; carry /= 10; i++; } c.n = i; } int NumberToStr(Number& a, char *s) { if (a.n == 0) { s[0] = '0'; s[1] = 0; return 1; } for (int i = 0; i < a.n; i++) s[a.n - 1 - i] = '0' + a.d[i]; s[a.n] = 0; return a.n; } int max(int a, int b) { if (a < b) return b; else return a; } int max(int a, int b, int c) { return max(max(a, b), c); } char tempSpaces[1100], tempDashes[1100]; void PrintSpaces(int n) { tempSpaces[n] = 0; printf(tempSpaces); tempSpaces[n] = ' '; } void PrintDashes(int n) { tempDashes[n] = 0; printf(tempDashes); tempDashes[n] = '-'; } void PrintSimple(Number& a, Number& b, Number& c, char op) { int la, lb, lc, lBar, l; char sa[1100], sb[1100], sc[1100]; la = NumberToStr(a, sa); lb = NumberToStr(b, sb); lc = NumberToStr(c, sc); l = max(la, lb + 1, lc); lBar = max(lb + 1, lc); PrintSpaces(l - la); printf("%s\n", sa); PrintSpaces(l - lb - 1); printf("%c%s\n", op, sb); PrintSpaces(l - lBar); PrintDashes(lBar); printf("\n"); PrintSpaces(l - lc); printf("%s\n", sc); } void PrintMultiply(Number& a, Number& b) { char sa[1100], sb[1100], sc[1100]; char s[600][1100]; Number c, c1; int i, l, la, lb, lc, lBar1, lBar2, L[600]; la = NumberToStr(a, sa); lb = NumberToStr(b, sb); c.n = 0; l = max(la, lb + 1); for (i = 0; i < b.n; i++) { Multiply(a, b.d[i], c1); L[i] = NumberToStr(c1, s[i]) + i; //NumberToStr(c1, sc); printf("i = %d, c1 = %s\n", i, sc); Add(c, c1, c, i); if (L[i] > l) l = L[i]; //NumberToStr(c, sc); printf("i = %d, c = %s\n", i, sc); } lc = NumberToStr(c, sc); if (lc > l) l = lc; lBar1 = max(lb + 1, L[0]); lBar2 = max(lc, L[b.n - 1]); PrintSpaces(l - la); printf("%s\n", sa); PrintSpaces(l - lb - 1); printf("*%s\n", sb); PrintSpaces(l - lBar1); PrintDashes(lBar1); printf("\n"); for (i = 0; i < b.n; i++) { PrintSpaces(l - L[i]); printf("%s\n", s[i]); } PrintSpaces(l - lBar2); PrintDashes(lBar2); printf("\n"); PrintSpaces(l - lc); printf("%s\n", sc); } int main() { memset(tempSpaces, ' ', sizeof(tempSpaces)); memset(tempDashes, '-', sizeof(tempDashes)); char buf[5000]; gets(buf); int nCases; sscanf(buf, "%d", &nCases); while (nCases-- > 0) { gets(buf); char *pOp = findOperator(buf); char op = *pOp; *pOp = 0; Number a, b, c; ReadNumber(buf, a); ReadNumber(pOp + 1, b); switch (op) { case '+': Add(a, b, c); PrintSimple(a, b, c, op); break; case '-': Subtract(a, b, c); PrintSimple(a, b, c, op); break; case '*': if (b.n == 0) { c.n = 0; PrintSimple(a, b, c, op); } else if (b.n == 1) { Multiply(a, b.d[0], c); PrintSimple(a, b, c, op); } else PrintMultiply(a, b); break; } printf("\n"); } return 0; }