又是模拟啊!!!!!
题目大意:
给出一段程序,只有一个“BEGIN”在第一行作为程序的开始,对应在程序的结尾有一个“END”,程序内部有“LOOP”(循环)和“OP”(语句),每一个“OP”后带一个常数,表示“OP”执行几次,每一个“LOOP”对应一个“END”,在“LOOP”到“END”范围内的语句都要循环执行“LOOP”后面的数字的次数,这个数字有可能是常数,有可能是变量“n”。
题目要求计算时间复杂度。
下面是代码:
#include <stdio.h>
int Ntoi(char* s)
{
int n=0;
for(int i=0; s[i]; i++)
n=n*10+(s[i]-'0');
return n;
}
bool dfs(int* z)
{
char s[30];
scanf("%s",s);
if(s[0]=='E')
{
return false;
}
else if(s[0]=='B')
{
while(dfs(z));
}
else if(s[0]=='O')
{
scanf("%s",s);
z[0]+=Ntoi(s);
return dfs(z);
}
else
{
int tz[11]= {0};
scanf("%s",s);
while(dfs(tz));
if(s[0]=='n')
{
for(int i=10; i>0; i--)
tz[i]=tz[i-1];
tz[0]=0;
}
else
{
int x=Ntoi(s);
for(int i=0; i<11; i++)
{
tz[i]*=x;
}
}
for(int i=0; i<11; i++)
z[i]+=tz[i];
}
return true;
}
int main()
{
int T,cut=0;
scanf("%d",&T);
while(T--)
{
cut++;
int z[11]= {0},i;
dfs(z);
printf("Program #%d\n",cut);
printf("Runtime = ");
bool t=false,flat=false;
for(i=10; i>=0; i--)
{
if(i==0&&z[i])
{
if(flat)
{
printf("+");
flat=false;
}
printf("%d",z[i]);
t=true;
break;
}
if(z[i])
{
if(flat)
{
printf("+");
flat=false;
}
t=true;
if(z[i]>1)
{
printf("%d",z[i]);
}
flat=true;
if(i>1)
{
if(z[i]>1)
{
printf("*");
}
printf("n^%d",i);
}
else if(i==1)
{
if(z[i]>1)
{
printf("*");
}
printf("n");
}
}
}
if(t)
{
printf("\n\n");
}
else
{
printf("0\n\n");
}
}
return 0;
}