本文共 2064 字,大约阅读时间需要 6 分钟。
相当于表达式计算一般,用递归进行处理,将BEGIN视作是一个LOOP,每次进入LOOP则进行多条语句处理,知道遇到END位置,结束这个LOOP。
代码如下:
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;struct EXP { int a[11]; EXP () { memset(a, 0, sizeof (a)); } EXP mul(int x) { EXP ret; if (x == -1) { for (int i = 1; i <= 10; ++i) { ret.a[i] = a[i-1]; } } else { for (int i = 0; i <= 10; ++i) { ret.a[i] = x * a[i]; } } return ret; } EXP add(int x) { EXP ret = *this; ret.a[0] += x; return ret; } EXP add(EXP x) { EXP ret = *this; for (int i = 0; i <= 10; ++i) { ret.a[i] += x.a[i]; } return ret; }};EXP cal() { EXP ret; char op[20], num[20]; while (1) { scanf("%s", op); if (!strcmp(op, "LOOP")) { scanf("%s", num); if (num[0] == 'n') { ret = ret.add(cal().mul(-1)); } else { ret = ret.add(cal().mul(atoi(num))); } } else if (!strcmp(op, "OP")) { scanf("%s", num); ret = ret.add(atoi(num)); } else return ret; }}int main(){ int T, ca = 0; char coat[20]; bool first, zero; EXP ret; scanf("%d", &T); while (T--) { first = zero = true; scanf("%s", coat); ret = cal(); printf("Program #%d\n", ++ca); printf("Runtime = "); for (int i = 0; i <= 10; ++i) { if (ret.a[i]) zero = false; } if (zero) { puts("0\n"); continue; } for (int i = 10; i >= 0; --i) { if (ret.a[i]) { if (ret.a[i] == 1) { if (first) { if (i) { if (i == 1) { printf("n"); } else { printf("n^%d", i); } } else { printf("1"); } first = false; } else { if (i) { if (i == 1) { printf("+n"); } else { printf("+n^%d", i); } } else { printf("+1"); } } } else { // ret.a[i] != 1 if (first) { if (i) { if (i == 1) { printf("%d*n", ret.a[i]); } else { printf("%d*n^%d", ret.a[i], i); } } else { printf("%d", ret.a[i]); } first = false; } else { if (i) { if (i == 1) { printf("+%d*n", ret.a[i]); } else { printf("+%d*n^%d", ret.a[i], i); } } else { printf("+%d", ret.a[i]); } } } } } puts("\n"); } return 0;}
转载于:https://www.cnblogs.com/Lyush/archive/2012/09/13/2683898.html