首先不得不说我的英语水平太差,还有就是对题目很不敏感,我竟然看了好久没有看懂题意是什么,然后在网上搜的时候也没有发现解析题意的,然后又看了几遍才看懂的!
题目大致意思:给你一段程序,让你求出执行这段程序的时间复杂度,LOOP m代表循环m次,OP m代表的是对加m,end代表是一个LOOP循环语句的结束,最后一个END代表的是程序的结束!
昨天晚上写的时候题目没有分析完全,然后就是写的代码有bug,然后今天又写了一遍就过了,但是毕竟是看着测试数据之后才找到bug然后又写的代码,没有一点成就感啊!我用的是栈的方法写的,下面是代码!
#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;
}