#include #include int D; char opA[500], opB[500], operacja, znak; int rs[1005], nopA, nopB, nrs; int A[501], B[501], C[501], multi[1001], last[1001], i,j,k,l, result[1001]; int lA, lB, lres, lall; int nlength(int *Ain, int l) { int j; j = 0; while (Ain[j] == 0 && j <= l) j++; j = l-j+1; return (j == 0? 1 : j); } /* liczba, dlugosc liczby ogolna, dlugosc aktualna, liczba spacji, operator */ int printnumber(int *Ain, int llen, int len, int l, char opr) { int j; for (j = 0; j < l; j++) printf(" "); if (opr != '\0') printf("%c", opr); for (j = llen - len + 1; j <= llen; j++) printf("%c", Ain[j] + '0'); printf("\n"); } int add(int *Ain, int *Bin) { int i, j, o; memset(result, 0, sizeof(result)); o = 0; for (i = 500, j = 1000; i >= 0; i--, j--) { result[j] = Ain[i] + Bin[i] + o; if (result[j] > 9) { result[j] -= 10; o = 1; } else o = 0; } } int subtract(int *Ain, int *Bin) { int i, j, o; memset(result, 0, sizeof(result)); o = 0; for (i = 500, j = 1000; i >= 0; i --, j--) { result[j] = Ain[i] - Bin[i] - o; if (result[j] < 0) { result[j] += 10; o = 1; } else o = 0; } } int multiplicate1(int c) { int i, j, k, o; memset(last, 0, sizeof(last)); for ( i =0; i < c; i++) { o = 0; for (k = 500, j = 1000; k >= 0; k--, j--) { last[j] = last[j] + A[k] + o; if (last[j] > 9) { last[j] -= 10; o = 1; } else o = 0; } } } int multiplicate() { int i,j ,k, l, o, ltmp; memset(result, 0, sizeof(result)); lA = nlength(A, 500); lB = nlength(B, 500); j = 0; for (i = 500; i > (500-lB); i--, j++) { multiplicate1(B[i]); /* printnumber(last, 1000, nlength(last, 1000), 0, '\0');*/ o = 0; for (k = 1000-j, l = 1000; k >= 0; k--, l--) { result[k] = result[k] + last[l] + o; if (result[k] > 9) { result[k] -= 10; o = 1; } else o = 0; } } /* printnumber(result, 1000, nlength(result, 1000), 0, '\0'); */ lres = nlength(result, 1000); if (lres == lB) lall = lB+1; else lall = lres; if (lA > lres) lall = lA; printnumber(A, 500, lA, lall - lA, '\0'); printnumber(B, 500, lB, lall - lB -1, operacja); if (lB > 1) { j = 0; for (i = 500; i > (500-lB); i--, j++) { multiplicate1(B[i]); lA = nlength(last, 1000); if (j == 0) { ltmp = (lA > (lB+1) ? lA : lB+1); for (l=1; l<=lall-ltmp; l++) printf(" "); for (l=1; l<=ltmp; l++) printf("-"); printf("\n"); } printnumber(last, 1000, lA, lall - lA - j, '\0'); } for (j=1; j<=lall; j++) printf("-"); printf("\n"); } else { ltmp = (lres >= (lB+1) ? lres : lB+1); for (j=1; j<=lall-ltmp; j++) printf(" "); for (j=1; j<=ltmp; j++) printf("-"); printf("\n"); } printnumber(result, 1000, lres, lall - lres, '\0'); } int main() { int ltmp; scanf("%d\n", &D); while (D-- > 0) { nopA = 0; znak = getchar(); while (znak != '+' && znak != '-' && znak != '*') { opA[nopA++] = znak; znak = getchar(); } operacja = znak; nopB = 0; znak = getchar(); while (znak != '\n') { opB[nopB++] = znak; znak = getchar(); } /* printf("opA = %s\nopB = %s\noperacja = %c\n\n", opA, opB, operacja);*/ memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); for (i = 500, j = nopA-1; j >= 0; i--, j--) A[i] = (opA[j] - '0'); for (i = 500, j = nopB-1; j >= 0; i--, j--) B[i] = (opB[j] - '0'); if (operacja == '+') { add(A, B); lA = nlength(A, 500); lB = nlength(B, 500); lres = nlength(result, 1000); /* printf("lA = %d lB = %d lC = %d\n", lA, lB, lres); */ if (lB == lres) lall = lB + 1; else lall = lres; printnumber(A, 500, lA, lall - lA, '\0'); printnumber(B, 500, lB, lall - lB - 1, operacja); for (j = 1; j <= lall; j++) printf("-"); printf("\n"); printnumber(result, 1000, lres, lall - lres, '\0'); } if (operacja == '-') { subtract(A, B); lA = nlength(A, 500); lB = nlength(B, 500); lres = nlength(result, 1000); /* printf("lA = %d lB = %d lC = %d\n", lA, lB, lres); */ if (lres > (lB+1)) lall = lres; else lall = lB + 1; if (lA > lall) ltmp = lA; else ltmp = lall; printnumber(A, 500, lA, ltmp - lA, '\0'); printnumber(B, 500, lB, ltmp - lB - 1, operacja); for (j = 1; j <= ltmp - lall; j++) printf(" "); for (j = 1; j <= lall; j++) printf("-"); printf("\n"); printnumber(result, 1000, lres, ltmp - lres, '\0'); } if (operacja == '*') { multiplicate(); } printf("\n"); } return 0; }