#include #include int scitaj(int a[], int b[], int v[], int shift) { int zost, ia, ib, iv, akt_a, akt_b, max; ia=shift+1; ib=1; zost=0; iv=shift; while(ia<=a[0]||ib<=b[0]) { if (ia<=a[0]) akt_a=a[ia]; else akt_a=0; if (ib<=b[0]) akt_b=b[ib]; else akt_b=0; v[++iv]=(zost+akt_a+akt_b)%10; zost=(zost+akt_a+akt_b)/10; ia++; ib++; } if (iv>v[0]) v[0]=iv; while(zost) { if (ivv[0]) v[0]=iv; while(!v[v[0]]) v[0]--; max=a[0]; if (b[0]>max) max=b[0]; if (v[0]>max) max=v[0]; return max; } int nasob(int a[], int b, int v[]) { int zost, ia, ib, iv, max; ia=1; ib=1; zost=0; iv=0; while(ia<=a[0]) { v[++iv]=(zost+a[ia]*b)%10; zost=(zost+a[ia]*b)/10; ia++; } if (zost) v[++iv]=zost; if (iv>v[0]) v[0]=iv; while(!v[v[0]]) v[0]--; max=a[0]; if (v[0]>max) max=v[0]; return max; } int odcitaj(int a[], int b[]) { int zost, ib, max, last_d; ib=1; last_d=0; zost=0; while(ib<=b[0]) { a[ib]=a[ib]-(b[ib]+zost); if (a[ib]<0) { a[ib]+=10; zost=1; } else zost=0; ib++; } if (zost) a[ib]--; while(!a[a[0]]) a[0]--; if (!a[0]) a[0]++; max=a[0]; if (b[0]>max) max=b[0]; if (a[0]>max) max=a[0]; return max; } void spaces(int n) { int i; for(i=0; i47)&&(vstup[i]<58)&&(i>=0)) { b[++b[0]]=vstup[i]-48; if (b[b[0]]&&b[0]>last_d) last_d=b[0]; i--; } b[0]=last_d; op=vstup[i]; i--; last_d=1; a[0]=0; while((vstup[i]>47)&&(vstup[i]<58)&&(i>=0)) { a[++a[0]]=vstup[i]-48; if (a[a[0]]&&a[0]>last_d) last_d=a[0]; i--; } a[0]=last_d; switch(op) { case '+' : vys[0]=1; vys[1]=0; maxl=a[0]; if (b[0]+1>maxl) maxl=b[0]+1; l=scitaj(a, b, vys, 0); if (l>maxl) maxl=l; spaces(maxl-a[0]); printnumber(a); spaces(maxl-b[0]-1); printf("+"); printnumber(b); printline(maxl); spaces(maxl-vys[0]); printnumber(vys); break; case '-': vys[0]=1; vys[1]=0; maxl=a[0]; if (b[0]+1>maxl) maxl=b[0]+1; spaces(maxl-a[0]); printnumber(a); spaces(maxl-b[0]-1); printf("-"); printnumber(b); printline(maxl); odcitaj(a, b); spaces(maxl-a[0]); printnumber(a); break; case '*' : vys[0]=1; vys[1]=0; pvys[0]=1; pvys[1]=0; maxl=a[0]; if (b[0]+1>maxl) maxl=b[0]+1; for(i=0; i<10; i++) mv[i][0]=0; for(i=1; i<=b[0]; i++) { if (b[i]) { if (!mv[b[i]][0]) nasob(a, b[i], mv[b[i]]); if (mv[b[i]]+i-1>maxl) maxl=mv[b[i]]+i-1; l=scitaj(vys, mv[b[i]], pvys, i-1); if (l>maxl) maxl=l; for(j=0; j<=pvys[0];j++) vys[j]=pvys[j]; } else mv[0][0]=1; } spaces(maxl-a[0]); printnumber(a); spaces(maxl-b[0]-1); printf("*"); printnumber(b); printline(maxl); for(i=1; i<=b[0]; i++) { spaces(maxl-mv[b[i]][0]-i+1); printnumber(mv[b[i]]); } if (b[0]>1) { printline(maxl); spaces(maxl-vys[0]); printnumber(vys); } break; } } return 0; }