#include #include #include #include #include #define ADD 0 #define DIV 1 #define DUP 2 #define MUL 3 #define SUB 4 char *name[] = { "ADD", "DIV", "DUP", "MUL", "SUB" }; int op[20]; #define ERR 33000 int calc(int number, int num_ops) { int stack[1000]; int sp = 1; stack[0] = number; int sum; for(int i = 0; i< num_ops; i++) { //if (sp > 1+(num_ops-i)) return ERR; switch(op[i]) { case ADD: if(sp < 2) return ERR; sum = stack[--sp]; sum += stack[--sp]; stack[sp++] = sum; break; case SUB: if(sp < 2) return ERR; sum = -stack[--sp]; sum += stack[--sp]; stack[sp++] = sum; break; case MUL: if(sp < 2) return ERR; sum = stack[--sp]; sum *= stack[--sp]; stack[sp++] = sum; break; case DIV: if(sp < 2) return ERR; sum = stack[--sp]; if(sum == 0) return ERR; sum = stack[--sp]/sum; stack[sp++] = sum; break; case DUP: stack[sp] = stack[sp - 1]; sp++; break; } if(stack[sp - 1] > 30000 || stack[sp - 1] < -30000) return ERR; } if(sp != 1) return ERR; return stack[0]; } int xi[20], yi[20]; int num; int found; void test(int pos, int opmax, int sp) // aktuell hoechste lange der ops. { if (sp<0) return; // Stack-Unterlauf, ist auch zwischendurch nicht moeglich if(pos == opmax) { if (sp==0) { // nur rechnen wenn Stackbenutzung stimmt int eq = 1; for(int i = 0; i < num; i++) { if(yi[i] != calc(xi[i], pos)) { eq = 0; break; } } if(eq) { if (pos==0) { cout << "Empty sequence\n"; } else if (!found) { for(int i = 0; i < pos; i++) { cout << name[op[i]]; if (i+1> num; if(num == 0) return 0; prog++; cout << "Program " << prog << endl; for(int i = 0; i < num; i++) in >> xi[i]; for(int i = 0; i < num; i++) in >> yi[i]; found=0; for(int opmax=0; opmax<=10; opmax++) { test(0, opmax, 0); if (found) break; } if(!found) cout << "Impossible\n"; cout << endl; } }