#include #define SIZE 2048 #define SUM(c1,c2) (((c1)-'0')+((c2)-'0')) #define MAX(a,b) ((a)>(b)?(a):(b)) char is[2048]; char spaces[SIZE], dashes[SIZE]; char op1[SIZE], op2[SIZE], operator; char res[SIZE]; char auxres[512][SIZE]; int auxp[512], auxl[512]; void spc(int x) {spaces[x]='\0'; printf("%s",spaces); spaces[x]=' ';} void das(int x) {dashes[x]='\0'; printf("%s",dashes); dashes[x]='-';} void sum(char *o1, int p1, int l1, char *o2, int p2, int l2, char *res, int *pres, int *lres) { int x, suma, beginpos, carry; beginpos=x=p1+l1-1; res[beginpos+1]='\0'; carry=0; while (x>=p1 && x>=p2) /* lze scitat */ { suma=SUM(o1[x],o2[x])+carry; res[x]='0'+suma%10; carry=suma/10; x--; } while (x>=p2) /* zbyl druhy scitanec */ { suma=SUM('0',o2[x])+carry; res[x]='0'+suma%10; carry=suma/10; x--; } while (x>=p1) /* zbyl prvni scitanec */ { suma=SUM('0',o1[x])+carry; res[x]='0'+suma%10; carry=suma/10; x--; } if (carry) res[x--]='1'; *pres=x+1; *lres=beginpos-x; } void sub(char *o1, int p1, int l1, char *o2, int p2, int l2, char *res, int *pres, int *lres) { int x, beginpos, carry, o1x, o2x, xx; beginpos=x=p1+l1-1; res[beginpos+1]='\0'; carry=0; while (x>=p1 && x>=p2) /* lze scitat */ { o1x=o1[x]-'0'; o2x=o2[x]-'0'+carry; if (o1x>=o2x) { res[x]='0'+o1x-o2x; carry=0; } else { res[x]='0'+10+o1x-o2x; carry=1; } x--; } while (x>=p1) /* zbyl delenec */ { o1x=o1[x]-'0'; o2x=0+carry; if (o1x>=o2x) { res[x]='0'+o1x-o2x; carry=0; } else { res[x]='0'+10+o1x-o2x; carry=1; } x--; } for (xx=x+1; res[xx]=='0'; xx++); x=xx-1; *pres=x+1; *lres=beginpos-x; } void mul(char *o1, int p1, int l1, char oop2, int delta, char *res, int *pres, int *lres) { int x, beginpos, carry, o1x, op2x, prod, xres; x=p1+l1-1; beginpos=xres=x-delta; res[xres+1]='\0'; carry=0; op2x=oop2-'0'; /*printf("= %i %i %i [%c][%i]%i\n",p1,l1,delta,oop2,oop2,op2x);*/ if (op2x==0) { res[xres--]='0'; x--; } else while (x>=p1) /* lze scitat */ { o1x=o1[x]-'0'; prod=o1x*op2x+carry; /*printf("prod=%i\n",prod);*/ res[xres]='0'+prod%10; carry=prod/10; x--; xres--; } if (carry) res[xres--]='0'+carry; *pres=xres+1; /*printf("[%s]\n",res+*pres);*/ *lres=beginpos-xres; } void sumaux(int auxn, char *res, int *pres, int *lres) { int x, suma, beginpos, carry, cansum, ox, i, nextcansum; beginpos=x=auxp[0]+auxl[0]-1; res[beginpos+1]='\0'; carry=0; while (cansum) { suma=0; nextcansum=0; for (i=0; i=auxp[i] && x<=auxp[i]+auxl[i]-1) ox=auxres[i][x]-'0'; else ox=0; suma+=ox; /*printf("?%i %i\n",suma,ox);*/ if (x-1>=auxp[i]) nextcansum=1; } suma+=carry; res[x]='0'+suma%10; carry=suma/10; x--; cansum=nextcansum; } if (carry) res[x--]='0'+carry; *pres=x+1; *lres=beginpos-x; } int main(void) { int i, l1, l2, p1, p2, pres, lres, N, width, delta, width1, width2; gets(is); sscanf(is,"%i",&N); memset(spaces,' ',(SIZE-2)*sizeof(char)); spaces[SIZE-1]='\0'; memset(dashes,'-',(SIZE-2)*sizeof(char)); dashes[SIZE-1]='\0'; while (N--) { gets(is); /* printf("is=%s\n",is);*/ for (i=0; ; i++) if (is[i]=='+' || is[i]=='-' || is[i]=='*') { operator=is[i]; is[i]='\0'; l1=strlen(is); p1=SIZE-l1-1; strcpy(op1+p1,is); l2=strlen(is+i+1); p2=SIZE-l2-1; strcpy(op2+p2,is+i+1); /* printf("%s\n%s\n",op1+p1,op2+p2);*/ break; } switch (operator) { case '+' : sum(op1,p1,l1,op2,p2,l2,res,&pres,&lres); width=MAX(l1,l2+1); width=MAX(width,lres); spc(width-l1); printf("%s\n",op1+p1); spc(width-l2-1); printf("+%s\n",op2+p2); das(width); printf("\n"); spc(width-lres); printf("%s\n",res+pres); printf("\n"); break; case '-' : sub(op1,p1,l1,op2,p2,l2,res,&pres,&lres); width=MAX(l1,l2+1); width=MAX(width,lres); spc(width-l1); printf("%s\n",op1+p1); spc(width-l2-1); printf("-%s\n",op2+p2); das(width); printf("\n"); spc(width-lres); printf("%s\n",res+pres); printf("\n"); break; case '*' : for (i=l2-1; i>=0; i--) { delta=l2-1-i; mul(op1,p1,l1,op2[i+p2],delta,*(auxres+delta),auxp+delta,auxl+delta); /* mul(op1,p1,l1,op2[i+p2],delta,res,&pres,&lres);*/ /*printf("delta,auxp,l= %i, %i, %i\n",delta,auxp[delta],auxl[delta]);*/ } /* for (i=0; i1) { spc(width2-width1); das(width1); printf("\n"); for (i=0; i