poj 1472(递归模拟)
题意:就是让你求出时间复杂度。
分析:由于指数最多为10次方,所以可以想到用一个数组保存各个指数的系数,具体看代码实现吧!
代码实现:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char str[1000][100]; char key[100]; int num; struct node{ int sum[15]; void init() { memset(sum,0,sizeof(sum)); } }; void init()//把字符串提取出来 { int i,t=1,num=0; scanf("%s",key); while(t) { scanf("%s",key); strcpy(str[num++],key); if(key[0]=='E') t--; else if(key[0]=='L') t++; } } struct node xiangcheng(struct node a,struct node b)//相乘 { int i,j; struct node res; res.init(); for(i=0;i<=10;i++) for(j=0;j<=10;j++) res.sum[i+j]=res.sum[i+j]+a.sum[i]*b.sum[j]; return res; } struct node add(struct node a,struct node b)//相加 { int i; for(i=0;i<=10;i++) a.sum[i]+=b.sum[i]; return a; } struct node dfs() { int i=0; struct node a; a.init(); while(1)//碰到END才结束 { i=0; if(str[num][0]=='L') { num=num+1; struct node b; b.init(); if(str[num][0]=='n') b.sum[1]++; else { int k=0; i=0; while(str[num][i]!='\0') { k=k*10+str[num][i]-'0'; i++; } b.sum[0]=b.sum[0]+k; } num=num+1; b=xiangcheng(b,dfs()); a=add(a,b); } else if(str[num][0]=='O') { num=num+1; if(str[num][0]=='n') a.sum[1]++; else { int k=0; i=0; while(str[num][i]!='\0') { k=k*10+str[num][i]-'0'; i++; } a.sum[0]=a.sum[0]+k; } } else if(str[num][0]=='E') return a; num++; } } int main() { int T; int i,j,flag; struct node a; scanf("%d",&T); getchar(); for(j=1;j<=T;j++) { num=0; init(); a=dfs(); printf("Program #%d\nRuntime = ",j); i=10;flag=0; while(a.sum[i]==0) i--; for(;i>1;i--) { if(a.sum[i]==0) continue; if(flag==0) { if(a.sum[i]>1) printf("%d*",a.sum[i]); printf("n^%d",i); flag++; } else { printf("+"); if(a.sum[i]>1) printf("%d*",a.sum[i]); printf("n^%d",i); } } if(a.sum[1]) { if(flag) printf("+"); if(a.sum[1]>1) printf("%d*",a.sum[1]); printf("n"); flag++; } if(a.sum[0]) { if(flag) printf("+"); printf("%d",a.sum[0]); flag++; } if(flag==0) printf("0"); printf("\n\n"); } return 0; }
posted on 2013-09-06 20:25 后端bug开发工程师 阅读(728) 评论(0) 编辑 收藏 举报