#include #include char mm[1000][1000]; void plus(char *d, char *s1, char *s2) { int p, x; p = 0; while (1) { x = ((*s1?*s1 - '0': 0)) + ((*s2?*s2 - '0': 0)) + p; p = x / 10; x = x % 10; *d = x + '0'; if (*s1) s1++; if (*s2) s2++; d++; if (!*s1 && !*s2 && p == 0) break; } *d = 0; } void minus(char *d, char *s1, char *s2) { int p, x; p = 0; while (1) { x = ((*s1?*s1 - '0': 0)) - p - ((*s2?*s2 - '0': 0)); if (x < 0) { p = 1; x += 10; } else { p = 0; } *d = x + '0'; if (*s1) s1++; if (*s2) s2++; d++; if (!*s1 && !*s2 && p == 0) break; } *d = 0; d--; while (*d == '0') {*d=0; d--;} } void krat1(char *d, char *s1, char c, int i) { int p, x; char *d2; p = 0; while (i--) *d++ = '0'; d2 = d; while (1) { x = ((*s1?*s1 - '0': 0)) * (c - '0') + p; p = x / 10; x = x % 10; *d = x + '0'; if (*s1) s1++; d++; if (!*s1 && p == 0) break; } *d = 0; d--; while (*d == '0' && d>d2) {*d=0; d--;} } void krat(char *d, char *s1, char *s2) { int i; char s[1000], *d2; for (i = 0; i < strlen(s2); i++) { krat1(mm[i], s1, s2[i], i); } *d=0; for (i = 0; i < strlen(s2); i++) { plus(s, d, mm[i]); strcpy(d, s); } d2 = d; while (*d) d++; d--; while (*d == '0' && d>d2) {*d=0; d--;} } void rev(char *d, char *s) { int l=strlen(s); while(l--) { *d=s[l]; d++; } *d=0; } void vypisp(char *d, char *s1, char *s2) { char b[1000]; int l = strlen(d); int i; if (l == strlen(s2)) l++; rev(b, s1); printf("%*s\n", l, b); strcat(s2, "+"); rev(b, s2); printf("%*s\n", l, b); for(i=0; i < l ; i++) { putchar('-'); } puts(""); rev(b, d); printf("%*s\n", l, b); } void vypism(char *d, char *s1, char *s2) { char b[1000]; int l = strlen(s1); int l2 = strlen(d); int i; if (l2 < strlen(s2)+1) l2 = strlen(s2)+1; if (l < l2) l = l2; rev(b, s1); printf("%*s\n", l, b); strcat(s2, "-"); rev(b, s2); printf("%*s\n", l, b); for(i=0; i < l-l2 ; i++) { putchar(' '); } for(i=0; i < l2 ; i++) { putchar('-'); } puts(""); rev(b, d); printf("%*s\n", l, b); } void vypisk(char *d, char *s1, char *s2) { char b[1000]; int l = strlen(d); int l2 = strlen(mm[0]); int l3 = strlen(mm[strlen(s2)-1]); int i, j; if (l2 < strlen(s2) + 1) l2 = strlen(s2)+1; if (l < strlen(s1)) l = strlen(s1); if (l < strlen(s2)+1) l = strlen(s2) + 1; if (l3 < strlen(d)) l3 = strlen(d); rev(b, s1); printf("%*s\n", l, b); strcat(s2, "*"); rev(b, s2); printf("%*s\n", l, b); if (strlen(s2) >2) { for(i=0; i < l-l2 ; i++) { putchar(' '); } for(i=0; i < l2 ; i++) { putchar('-'); } puts(""); for (i = 0; i < strlen(s2)-1; i++) { rev(b, mm[i]+i); printf("%*s\n", l - i, b); } } else { if (l3 < strlen(s2)) l3 = strlen(s2); } for(i=0; i < l-l3 ; i++) { putchar(' '); } for(i=0; i < l3 ; i++) { putchar('-'); } puts(""); rev(b, d); printf("%*s\n", l, b); } int main() { int zadani; char buff[5000]; char n1[5000], n2[5000], op; gets(buff); sscanf(buff, "%d", &zadani); while(zadani > 0) { char *s, *t, *u, *v; int i, j; gets(buff); op=' '; if (s = strchr(buff, '+')) { op = *s; t = s + 1; for (u = s - 1, i = 0; u >= buff; u--, i++) { n1[i] = *u; } n1[i] = 0; u = t; while (*u) u++; u--; for (i = 0; u >= t; u--, i++) { n2[i] = *u; } n2[i] = 0; } if (s = strchr(buff, '-')) { op = *s; t = s + 1; for (u = s - 1, i = 0; u >= buff; u--, i++) { n1[i] = *u; } n1[i] = 0; u = t; while (*u) u++; u--; for (i = 0; u >= t; u--, i++) { n2[i] = *u; } n2[i] = 0; } if (s = strchr(buff, '*')) { op = *s; t = s + 1; for (u = s - 1, i = 0; u >= buff; u--, i++) { n1[i] = *u; } n1[i] = 0; u = t; while (*u) u++; u--; for (i = 0; u >= t; u--, i++) { n2[i] = *u; } n2[i] = 0; } switch (op) { case '+': plus(buff, n1, n2); vypisp(buff, n1, n2); break; case '-': minus(buff, n1, n2); vypism(buff, n1, n2); break; case '*': krat(buff, n1, n2); vypisk(buff, n1, n2); break; } /* puts(n1); putchar(op); puts(n2); puts(buff);*/ puts(""); zadani--; } return 0; }