#include #include typedef struct { char d[501]; int n; } number_t; typedef enum {op_add, op_sub, op_mul} op_t; number_t x,y,res,pres[501]; /* data x, data y, result, partial result (mul) */ op_t op; void swap_digits(number_t *n) { int i,j; char t; for (i=0, j=n->n-1; id[i]; n->d[i]=n->d[j]; n->d[j]=t; } } void read_expr() { char line[1024]; char *p; fgets(line,1024,stdin); p=line; /* read first number */ x.n=0; while (strchr("0123456789",*p)) { x.d[x.n++]=*p-'0'; p++; } /* read operator */ switch (*p) { case '+': op=op_add; break; case '-': op=op_sub; break; case '*': op=op_mul; break; } p++; /* read second number */ y.n=0; while (strchr("0123456789",*p)) { y.d[y.n++]=*p-'0'; p++; } swap_digits(&x); swap_digits(&y); } void add() { int i; char c=0; for (i=0; i9) { c=1; res.d[i]-=10; } else c=0; } while (i9) { c=1; res.d[i]-=10; } else c=0; i++; } while (i9) { c=1; res.d[i]-=10; } else c=0; i++; } if (c>0) res.d[i++]=c; res.n=i; } void sub() { int i; char c=0; for(i=0; i9) { c=1; res.d[i]-=10; } else c=0; } while (i9) { c=1; res.d[i]-=10; } else c=0; i++; } while (i<(pres[s].n+s)) { res.d[i]=pres[s].d[i-s]+c; if (res.d[i]>9) { c=1; res.d[i]-=10; } else c=0; i++; } if (c>0) res.d[i++]=c; res.n=i; } void mul_by_digit(int i) { int j; char c=0; char d=y.d[i]; if (d==0) { pres[i].n=1; pres[i].d[0]=0; return; } for (j=0; j9) { c=pres[i].d[j]/10; pres[i].d[j]%=10; } else c=0; } if (c>0) pres[i].d[j++]=c; pres[i].n=j; } void mul() { int i; for (i=0; in-1; i>=0; i--) fputc(n->d[i]+'0',stdout); } void show_simple() { int r,i; r=x.n; if (y.n+1>r) r=y.n+1; if (res.n>r) r=res.n; for (i=0; ir1) r1=y.n+1; if (pres[0].n>r1) r1=pres[0].n; r2=r1; if (res.n>r2) r2=res.n; for (i=0; i1) { for (i=1; i0) { read_expr(); solve(); t--; } return 0; }