/* ACM International Collegiate Programming Contest Central European Regional Contest 2000 Problem A - Simple Arithmetics Jaroslav Volsicky */ #include #include #include #include #define MAX_NUMBER_DIGITS 512 char PROC[MAX_NUMBER_DIGITS+10][MAX_NUMBER_DIGITS*2+10]; int PROC_LEN[MAX_NUMBER_DIGITS+10]; void reverse(char * const r,const int r_len) { int a=0, b=r_len-1, bck; while (b>a) { bck=r[a]; r[a++]=r[b]; r[b--]=bck; } } int plus(char * const f, const int f_len, char * const s, const int s_len, const int null, char * const vysledek, int * const vysledek_len) { int max_len=(s_len<(f_len+null)) ? (f_len+null) : s_len; int s_idx=0,f_idx=0,last=0,idx_null=null,nula=-1; int n; while (f_idxs_idx)?(s[s_idx]-'0'):0) + ((idx_null>0)?0:((f_len>f_idx)?(f[f_idx]-'0'):0)) + last; if (n>9) { last=1; n-=10; } else last=0; vysledek[s_idx]=n+'0'; if (!n && s_idx>0) { if (nula==-1) nula=s_idx; } else nula=-1; ++s_idx; if (idx_null--<=0) ++f_idx; } if (last) { vysledek[s_idx++]='1'; nula=-1; } if (nula>0) s_idx=nula; vysledek[s_idx]='\0'; *vysledek_len=s_idx; return 3; } int minus(char * const f, const int f_len, char * const s, const int s_len, char * const vysledek, int * const vysledek_len) { int max_len=(s_lenidx)?(s[idx]-'0'):0) - last; if (n<0) { last=1; n+=10; } else last=0; vysledek[idx]=n+'0'; if (!n && idx>0) { if (null_idx==-1) null_idx=idx; } else null_idx=-1; } if (null_idx>0) idx=null_idx; vysledek[idx]='\0'; *vysledek_len=idx; return 3; } int mult(char * const f, const int f_len, char * const s, const int s_len) { int ret=2; int s_idx,f_idx; int n; int n_low,n_high; int ss; n_low=0; for(s_idx=0;s_idx0) { scanf("%s\n",PROC[0]); a=1; f=PROC[0]; while (isdigit(PROC[0][a++])); s=&PROC[0][a]; op=PROC[0][a-1]; PROC[0][a-1]='\0'; PROC_LEN[0]=a-1; PROC_LEN[1]=strlen(s); strncpy(PROC[1],s,PROC_LEN[1]+1); reverse(PROC[0],PROC_LEN[0]); reverse(PROC[1],PROC_LEN[1]); if (op=='+') ll=plus(PROC[0],PROC_LEN[0],PROC[1],PROC_LEN[1],0,PROC[2],&PROC_LEN[2]); else if (op=='-') ll=minus(PROC[0],PROC_LEN[0],PROC[1],PROC_LEN[1],PROC[2],&PROC_LEN[2]); else if (op=='*') ll=mult(PROC[0],PROC_LEN[0],PROC[1],PROC_LEN[1]); reverse(PROC[0],PROC_LEN[0]); reverse(PROC[1],PROC_LEN[1]); dash=PROC_LEN[0]>(PROC_LEN[1]+1)?PROC_LEN[0]:PROC_LEN[1]+1; if (ll==3) { if (dashPROC_LEN[2]?PROC_LEN[1]+1:PROC_LEN[2]); put_char(dash-dashm,' '); put_char(dashm,'-'); putchar('\n'); put_char(dash-PROC_LEN[2],' '); printf("%s\n",PROC[2]); } else { PROC[ll][0]='0'; PROC[ll][1]='\0'; PROC_LEN[ll]=1; bl1=ll; bl2=ll+1; for (a=2;aPROC_LEN[2]?PROC_LEN[1]+1:PROC_LEN[2]); put_char(dash-dashm,' '); put_char(dashm,'-'); putchar('\n'); for (a=2;a