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编辑  收藏  举报

导航