#include #include #include typedef int Vector[8]; int main (int argc, char **argv, char **envp); int parse (void); void Evaluate (void); void PrintExpr (void); char istr[11], mask[11] = {}; int nextbit=0, found; int main (int argc, char **argv, char **envp) { int ct=1; stdin = fopen ("bartjens.in","r"); stdout = fopen ("bartjens.out","w"); while (1) { fgets (istr,11,stdin); if (istr[strlen(istr)-1]!='\n') while (getchar()!='\n'); if (istr[0]=='=') break; printf ("Problem %d\n",ct++); found = 0; Evaluate (); if (!found) printf (" IMPOSSIBLE\n"); } fclose (stdin); fclose (stdout); return EXIT_SUCCESS; } void Evaluate (void) { int i; if ((istr[nextbit]!='0' || istr[nextbit+1]=='=') && parse()==2000) { PrintExpr (); found = 1; } i=nextbit; while (istr[nextbit+1]!='=') { mask[nextbit++]='+'; Evaluate (); mask[nextbit-1] = '-'; Evaluate (); mask[nextbit-1] = '*'; Evaluate (); mask[nextbit-1]=0; if (istr[nextbit-1]=='0'&&nextbit>1&&mask[nextbit-2]!=0) break; } nextbit = i; } int parse (void) { int i, sto1=0, sto2=0, cur=0; char op1 = ' ', op2 = ' '; for (i=0; istr[i]!='=';i++) { cur = 10*cur+istr[i]-'0'; switch (mask[i]) { case '-': case '+': switch (op1) { case ' ': sto1 = cur; break; case '+': switch (op2) { case ' ': sto1 += cur; break; case '*': sto2 *= cur; sto1 += sto2; break; } break; case '-': switch (op2) { case ' ': sto1 -= cur; break; case '*': sto2 *= cur; sto1 -= sto2; break; } break; case '*': sto1 *= cur; break; } cur = 0; op1 = mask[i]; op2 = ' '; break; case '*': switch (op1) { case ' ': sto1 = cur; op1 = '*'; op2 = ' '; break; case '-': case '+': switch (op2) { case ' ': sto2 = cur; op2 = '*'; break; case '*': sto2 *= cur; break; } break; case '*': sto1 *= cur; break; } cur = 0; break; } } switch (op1) { case ' ': sto1 = cur; break; case '+': switch (op2) { case ' ': sto1 += cur; break; case '*': sto2 *= cur; sto1 += sto2; break; } break; case '-': switch (op2) { case ' ': sto1 -= cur; break; case '*': sto2 *= cur; sto1 -= sto2; break; } break; case '*': sto1 *= cur; break; } return sto1; } void PrintExpr (void) { int i; printf (" "); for (i = 0; istr[i]!='='; i++) { printf ("%c",istr[i]); if (mask[i] != 0) printf ("%c",mask[i]); } printf ("=\n"); }