#include #define nula 1 char ins[2000]; class Cislo { public: Cislo() { init(); size = 0; } void init() { for (int ii = 0; ii < 510; ii++) data[ii] = 0; } int data[600]; int size; void cutlz() { for (int i = size-1; i > 0; i--) { if (data[i] == 0) size--; else return; } return; } void vypis(int ps) { int zeroes = 1; for (int i = ps-1; i >= 0; i--) if (size-1 < i) printf(" "); else if ((!zeroes) || (data[i] != 0)) { printf("%c", data[i]+'0'); zeroes = 0; } else if (i > 0) printf(" "); else printf("0"); printf("\n"); } void vypis(char oper, int ps) { int zeroes = 1; int op = 0; ps--; for (int i = ps-1; i >= 0; i--) if (size-1 < i) printf(" "); else if ((!zeroes) || (data[i] != 0)) { if (!op) { printf("%c", oper); op = 1; } printf("%c", data[i]+'0'); zeroes = 0; } else if (i > 0) printf(" "); else { if (!op) { printf("%c", oper); op = 1; } printf("0"); } printf("\n"); } }; int n,i; Cislo c1, c2, vysledok; char oper; void readCislo(Cislo &c, int &pos) { c.init(); c.size = 0; while (ins[pos] >= '0' && ins[pos] <= '9') c.data[c.size++] = ins[pos++]-'0'; for (int ii = 0; ii < c.size/2; ii++) { int temp = c.data[c.size-1-ii]; c.data[c.size-1-ii] = c.data[ii]; c.data[ii] = temp; } } void sucet(Cislo &vysl, Cislo &c1, Cislo &c2) { int maxsize = c1.size; if (maxsize < c2.size) maxsize = c2.size; int prenos = 0; int j; for (j = 0; j < maxsize; j++) { vysl.data[j] = c1.data[j] + c2.data[j] + prenos; prenos = 0; if (vysl.data[j] >= 10) { prenos = vysl.data[j] / 10; vysl.data[j] = vysl.data[j] % 10; } } if (prenos) { vysl.data[j++] = prenos; } vysl.size = j; } void nc(Cislo &vysl, Cislo &c1, int c2) { int prenos = 0; int j; for (j = 0; j < c1.size; j++) { vysl.data[j] = c1.data[j] * c2 + prenos; prenos = 0; if (vysl.data[j] >= 10) { prenos = vysl.data[j] / 10; vysl.data[j] = vysl.data[j] % 10; } } if (prenos) { vysl.data[j++] = prenos; } vysl.size = j; } void rozdiel(Cislo &vysl, Cislo &c1, Cislo &c2) { int maxsize = c1.size; if (maxsize < c2.size) maxsize = c2.size; int prenos = 0; int j; for (j = 0; j < maxsize; j++) { vysl.data[j] = c1.data[j] - c2.data[j] - prenos; prenos = 0; if (vysl.data[j] < 0) { prenos = 1; vysl.data[j] = 10 + vysl.data[j]; } } /* if (prenos) { vysl.data[j++] = prenos; } */ vysl.size = j; } int nasob(Cislo &vysl, Cislo &c1, Cislo &c2) { vysl.size = 0; Cislo mv[c2.size]; for (int r = 0; r < c2.size; r++) nc(mv[r], c1, c2.data[r]); Cislo cc; for (int r = 0; r < c2.size; r++) { Cislo cd; Cislo mvr; for (int q = 0; q < mv[r].size; q++) { mvr.data[q+r] = mv[r].data[q]; } mvr.size = mv[r].size+r; sucet(cd, mvr, cc); for (int q = 0; q < cd.size; q++) { cc.data[q] = cd.data[q]; } cc.size = cd.size; } for (int q = 0; q < cc.size; q++) { vysl.data[q] = cc.data[q]; } vysl.size = cc.size; if (c2.size > 1) { for (int r = 0; r < c2.size; r++) mv[r].cutlz(); vysl.cutlz(); c1.cutlz(); c2.cutlz(); int maxsize = vysl.size; if (maxsize < c2.size+1) maxsize = c2.size+1; c1.vypis(maxsize); c2.vypis('*', maxsize); int csize = c2.size+1; if (csize < mv[0].size) csize = mv[0].size; for (int q = 0; q < maxsize-csize; q++) { printf(" "); } for (int q = 0; q < csize; q++) { printf("-"); } printf("\n"); csize = mv[c2.size-1].size + c2.size-1; if (csize < vysl.size) csize = vysl.size; for (int r = 0; r < c2.size; r++) { mv[r].vypis(maxsize-r); } for (int q = 0; q < maxsize-csize; q++) { printf(" "); } for (int q = 0; q < csize; q++) { printf("-"); } printf("\n"); vysl.vypis(maxsize); return 0; } return 1; } int main() { scanf("%d ", &n); for (i = 0; i < n; i++) { fgets(ins,1999,stdin); int pos = 0; readCislo(c1, pos); oper = ins[pos++]; readCislo(c2, pos); int maxsize = c1.size; if (maxsize < c2.size+1) maxsize = c2.size+1; int ttt = 1; if (oper == '*') { ttt = nasob(vysledok, c1, c2); } if (ttt) { if (oper == '+') sucet(vysledok, c1,c2); else if (oper == '-') rozdiel(vysledok, c1,c2); if (maxsize < vysledok.size) maxsize = vysledok.size; c1.cutlz(); c2.cutlz(); vysledok.cutlz(); c1.vypis(maxsize); c2.vypis(oper, maxsize); int sizeciarky = vysledok.size; if (c2.size+1 > sizeciarky) sizeciarky = c2.size+1; for (int j = 0; j < maxsize-sizeciarky; j++) printf(" "); for (int j = 0; j < sizeciarky; j++) printf("-"); printf("\n"); vysledok.vypis(maxsize); } printf("\n"); } return 0; }