#include<iostream> #include<string> #include<cmath> #include<cstdio> #include<stack> using namespace std; typedef struct Stack { int sign;//标记是loop还是op char s[10];//代表的是数据 int stage;//代表的是等级的 }rr; Stack point[1000]; typedef struct fun { int n,sum;//n的个数,系数的大小的e int range;//代表可以表示的范围的 }qq; fun a[1000]; int len; int tans(char *s) { int len,i,sum=0; len=strlen(s); for(i=0; i<len; i++) sum=sum*10+s[i]-'0'; return sum; } int cmp(const void *a,const void *b) { fun *c=(fun *)a; fun *d=(fun *)b; return d->n-c->n; } int Scan() { int cout=0,rrtt=0; int i,j,k,pre; i=0; j=0; char s[10]; stack<int>q;//建立栈的 while(scanf("%s",s)) { if(rrtt==0 && strcmp(s,"END")==0) break;//就是所有输入和输出已经结束了 if(strcmp(s,"LOOP")==0) { point[i].sign=0;// scanf("%s",point[i].s); cout++; rrtt++; q.push(i); point[i].stage=cout;//代表的是第几个循环的 i++; } if(strcmp(s,"OP")==0) { point[i].sign=1; scanf("%s",point[i].s); // point[i].stage=-1;//这个其实是没有意思的 q.push(i); i++; } if(strcmp(s,"END")==0) { while(true)//就是不为空 { pre=q.top(); q.pop(); if(point[pre].sign==0)//代表end的那个结束了 { for(k=0; k<j; k++) { if(point[pre].stage<=a[k].range) { if(strcmp(point[pre].s,"n")==0) { a[k].n++; } else a[k].sum*=tans(point[pre].s); } } rrtt--; break; } else { if(strcmp(point[pre].s,"n")==0) { a[j].n=1; a[j].sum=1; a[j].range=cout;//记录当前的循环层数的 } else { a[j].n=0; a[j].sum=tans(point[pre].s); a[j].range=cout; } j++; } } } } while(q.empty()==0)//不空的时候 { pre=q.top(); q.pop(); if(strcmp(point[pre].s,"n")==0) { a[j].n=1; a[j].sum=1; a[j].range=cout; } else { a[j].n=0; a[j].sum=tans(point[pre].s); a[j].range=cout; } j++; } return j; } int main() { int T,i,j; scanf("%d",&T); for(int l=1; l<=T; l++) { j=Scan(); qsort(a,j,sizeof(fun),cmp);//对于n的数进行降序排列的 for(i=0; i<j-1; i++) { if(a[i].n==a[i+1].n) { a[i+1].sum+=a[i].sum; a[i].sum=0;//将其系数换为0 } } printf("Program #%d\n",l); printf("Runtime = "); int sign=0; for(i=0; i<j; i++) { if(a[i].sum==0) continue; sign++;//代表已经输出了 if(sign>1) printf("+");//多项式的不是第一项了 if(a[i].sum!=1 || (a[i].sum==1 && a[i].n==0)) printf("%d",a[i].sum); if(a[i].sum!=1 && a[i].n!=0) printf("*"); if(a[i].n==1) printf("n"); else if(a[i].n>1) printf("n^%d",a[i].n); } if(sign==0) printf("0"); printf("\n\n"); } return 0; }