#include #include #include #include #include char n1[510]; char n2[510]; char line[1500]; char res[510][1500]; int resc[510]; int resl; int i1, i2; #define MAX(a,b) ((a)>(b)?(a):(b)) int add() { int x; resl = 1; int c = 0; int i = 0; for( ; i < 500 && (i < i1 + 1 || i < i2 + 1); i++) { int x = n1[i] + n2[i]+ c; c = x / 10; res[0][i] = (x % 10) + '0'; } if(!c) res[0][i++] = c + '0'; int ii; for(ii = 0; ii < i1; ii++) n1[ii] += '0'; for(ii = 0; ii < i2; ii++) n2[ii] += '0'; n2[i2++] = '+'; x = MAX(i1, i2); if (c>0) x++; while(res[0][i-1] == 0 || res[0][i-1] == '0') --i; resc[0] = i; // printf("%d %d %d %d\n", i1, i2, x ,i+1); return MAX(x, i); } int sub() { int x; resl = 1; int c = 0; int i = 0; for( ; i < 500 && (i < i1 + 1 || i < i2 + 1); i++) { int x; if(n1[i] < n2[i] + c) { x = 10 + n1[i] - (n2[i] + c); c = 1; } else { x = n1[i] - (n2[i] + c); c = 0; } res[0][i] = x + '0'; } if(!c) res[0][i++] = c + '0'; int ii; for(ii = 0; ii < i1; ii++) n1[ii] += '0'; for(ii = 0; ii < i2; ii++) n2[ii] += '0'; n2[i2++] = '-'; x = MAX(i1, i2); while(res[0][i] == 0) --i; resc[0] = i; return x; } int mul() { int r[1200]; int i; for(i = 0; i < 1100; i++) r[i] = 0; int x; resl = 1; int c = 0; int id; int pre; // printf("test, %d %d\n", i1, i2); for(id = 0; id < i2; id++) { c=0; //prenos if(n2[id] == 0) { res[resl][id] = '0'; resc[resl]=1; } else { for(i = 0; i < i1; i++) { int x = n1[i] * n2[id] + c; r[i + id] += x-c; res[resl][i] = '0' + (x % 10); c = x / 10; // printf("hodnota %d prenos %d \n", x, c); } if(c!=0) res[resl][i] = c + '0'; resc[resl] = i+(c>0); // printf("delka je %d a prenos %d\n", i+(c>0), c); // res[resl][i+id+1]=0; } resl++; } pre=c>0; // printf("ddfgf %d\n", pre); int ii; for(ii = 0; ii < i1; ii++) n1[ii] += '0'; for(ii = 0; ii < i2; ii++) n2[ii] += '0'; n2[i2++] = '*'; c = 0; for(i = 0; i < i1 + i2-2 + (pre > 0); i++) { res[0][i] = '0' + ((r[i] + c) % 10); c = (r[i] + c) / 10; // printf("pocitani vysledku %d %d\n", r[i], c); } if (c>0) res[0][i++]=c+'0'; // printf("i %d %d %d\n", i1, i2 ,i); while(res[0][i] == '0') --i; x = MAX(i1, i2); //while(res[0][i] == 0) --i; //resc[0] = i; // printf("konec mul %d %d\n", i, x); return MAX(i, x); } void OneTask() { gets(line); int l = strlen(line); int i; for(i2 = 0, i = l-1; i >= 0 && isdigit(line[i]); i--) n2[i2++] = line[i]-'0'; char op = line[i--]; for(i1 = 0; i >= 0 && isdigit(line[i]); i--) n1[i1++] = line[i] - '0'; for(i = i1; i < 510; i++) n1[i] = 0; for(i = i2; i < 510; i++) n2[i] = 0; int x; switch(op) { case '+': x = add(); break; case '-': x = sub(); break; case '*': x = mul(); break; } //printf("%d\n\n", x); for(i = x-1; i >= i1; i--) putchar(' '); for( ; i >= 0; i--) putchar(n1[i]); putchar('\n'); for(i = x-1; i >= i2; i--) putchar(' '); for( ; i >= 0; i--) putchar(n2[i]); putchar('\n'); //if(op == '*') // { // } if(resl > 2) { // printf("test2: %d %d %d\n", i1, i2, x); int xx = MAX(i1, i2); for(i = x; i > xx; i--) putchar(' '); while(i--) putchar('-'); putchar('\n'); int j; for(j = 1; j < resl; j++) { // for(i = x-1; i > j-1 && (i >= resc[j]); i--) //putchar(' '); // printf("resc je %d\n", resc[j]); for (i=0; i= 0; i--) putchar(res[j][i]); putchar('\n'); } } for(i = 0; i < x; i++) putchar('-'); putchar('\n'); for(i = x-1; res[0][i] == '0' || res[0][i] == 0; i--) putchar(' '); for( ; i >= 0; i--) putchar(res[0][i]); putchar('\n'); putchar('\n'); } int main(void) { int T; scanf("%d", &T); while(getchar() != '\n') ; while(T--) { OneTask(); } return 0; }