#include <stdio.h> #define MAXexpression 100000 #define MAXDIVISION 1000char expression_NAME, expression[MAXexpression], RESULT[MAXexpression];int DIVISION[MAXDIVISION], N, DIVISION_TMES;int JUMP_BRACKET(char expression[], int i){ int left_bracket = 1, right_bracket = 0; while(1) { i++; if(expression[i] == '(') left_bracket ++; else if(expression[i] == ')') { right_bracket ++; if(left_bracket == right_bracket) return i+1; } }}char GET_LOWEST_OPERATOR(char expression[]){ char lowest_operator = 0; int i; if(expression[0] == '(') { i = JUMP_BRACKET(expression, 0); if(( expression[i]) == 0) return -(i-2); } for(i=0; expression[i] != 0; i++) { if(expression[i] == '(') i = JUMP_BRACKET(expression, i) - 1; else if(expression[i] == '+') return '+'; else if(expression[i] == '*') lowest_operator = '*'; else if(expression[i] == '^' && lowest_operator != '*') lowest_operator = '^'; } return lowest_operator;}void GET_RESULT(char final_expression[]){ int i; for(i=0; final_expression[i]!=0; i++) RESULT[i] = final_expression[i]; RESULT[i] = 0;}int COPY(char cur_expression[], int i, char pre_expression[], int n, int m){ for(; n<=m; n++,i++) cur_expression[i] = pre_expression[n]; cur_expression[i] = 0; return i;}void PROCEED(int div_num, char pre_expression[]) { char cur_expression[MAXexpression]; char lowest_operator; int i, j, k, expression_num; if(div_num == DIVISION_TMES) { GET_RESULT(pre_expression); return; } lowest_operator = GET_LOWEST_OPERATOR(pre_expression); if(lowest_operator == 0) { GET_RESULT(pre_expression); return; } if(lowest_operator < 0) { COPY(cur_expression, 0, pre_expression, 1, -lowest_operator); PROCEED(div_num+1, cur_expression); return; } expression_num = 0; for(i=0; ; i++) { if(pre_expression[i] == lowest_operator) { expression_num ++; i++; } if(expression_num == DIVISION[div_num] - 1) { j=0; while(1) { if(pre_expression[i] == '(') { k = JUMP_BRACKET(pre_expression, i); j = COPY(cur_expression, j, pre_expression, i, k-1); i = k; } if(pre_expression[i] == lowest_operator || pre_expression[i] == 0) { cur_expression[j] = 0; PROCEED(div_num+1, cur_expression); return; } cur_expression[j] = pre_expression[i]; j++; i++; } } if(pre_expression[i] == '(') i = JUMP_BRACKET(pre_expression, i) - 1; }}int main(){ int i, j, count = 0; while((expression_NAME = getchar()) != '*') { getchar(); getchar(); count ++; if(count > 1) putchar(10); printf("expression %c:n", expression_NAME); scanf("%s", expression); scanf("%d", &N); for(i=0; i<N; i++) { for(j=0; ; j++) { scanf("%d", &DIVISION[j]); if(getchar() == 10) { DIVISION_TMES = j + 1; break; } } PROCEED(0, expression); for(j=DIVISION_TMES-1; j>=0; j--) printf("op(%d,", DIVISION[j]); printf("%c", expression_NAME); for(j=DIVISION_TMES-1; j>=0; j--) printf(")"); printf("=%sn", RESULT); } }}