nyoj305

来源:互联网 发布:iphone刷机后 数据恢复 编辑:程序博客网 时间:2024/05/23 01:12

题目描述

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1. 一个正的十进制数 x 是一个表达式。

2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。

例如, 表达式 max(add(1,2),7) 的值为 7

请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

输入

第一行: N        表示要计算的表达式个数 (1≤ N ≤ 10)  

接下来有N行,    每行是一个字符串,表示待求值的表达式

(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不

超过1000。)

输出

输出有N行,每一行对应一个表达式的值。

样例输入

3add(1,2) max(1,999) add(min(1,1000),add(100,99)) 

样例输出

3999200
题意描述:有三种计算方式分别是add,min,max,根据计算规则算出括号内的值。
      
解题思路:用字符串输入,然后把add,min,max分别用转换1000001,1000002,1000003存入数组中,数字原样存入,括号不做处理,然后从内到外计算,计算过后把结果存入add,min,max代表的数字里,而计算过的数字转换为-1,具体代码有体现。

程序代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char str[10000];
    int a[10000],b[100],c[100],d[100],o,l,i,j,n,m,t,t1,k,y,e,p[1000];
    
    scanf("%d",&m);
    getchar();
    while(m--)
    {
        gets(str);
        l=strlen(str);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        j=0;t=0;
        
        for(i=0;i<l;i++)
        {
            if(str[i]=='m')
            {
                if(str[i+1]=='i')
                {
                    a[j++]=1000001;
                }
                if(str[i+1]=='a')
                {
                    a[j++]=1000002;
                }
                i=i+2;
            }
            if(str[i]=='a')
            {
                a[j++]=1000003;
                i=i+2;
            }
            //if(str[i]=='(')
        //    {
            //    a[j++]=1004;
            //}
            if(str[i]>='0'&&str[i]<='9')
            {
                a[j]=a[j]*10+str[i]-'0';
            }
            if(str[i]==',')
            {
                j++;
            }
            
        }
    /*    for(i=0;i<=j;i++)
        {
            printf("%-8d ",a[i]);
        }
        printf("\n");*/
        y=0;
        for(o=0;o<=j;o++)
        {
            y++;
            for(i=0;i<=j;i++)
            {
                if(a[i]>=1000001&&a[i+1]<1000000)
                {
                    t1=0;
                    e=0;
                    for(k=i+1;k<=j;k++)
                    {
                        if(a[k]<1000000&&a[k]>=0)
                        {
                            b[t1]=a[k];
                            p[e]=k;
                            e++;
                            d[k]=a[k];
                            a[k]=-1;
                            t1++;
                        }
                        if(t1==2)
                        {
                            break;
                        }
                        if(a[k]>1000000)
                        {    
                            t1=3;
                            break;
                        
                        }
                    }
                    if(t1==3)//如 add(1,add(5,6))正常应该先计算第二个add但是我们写的代码是遇到add就向后面找两个小于1000000

                    { 的数进行计算,但是读取第一个add就开始找数了,找到的1 5 ,但是明显5不是在这里用的,因此在遇到第

                         二个add是应该跳出找数的循环,并进行该段代码把换成-1的恢复到原样。

for(t=0;t<e;t++)
                        {
                            a[p[t]]=d[p[t]];
                        }
                        continue;
                    }
                    else{
                    
                    if(a[i]==1000001)
                    {
                        if(b[0]>b[1])
                        b[0]=b[1];
                        a[i]=b[0];
                    }
                    if(a[i]==1000002)
                    {
                        if(b[0]<b[1])
                        b[0]=b[1];
                        a[i]=b[0];
                    }
                    if(a[i]==1000003)
                    {
                        a[i]=b[1]+b[0];
                    }
                    }
                }
                
                
                //printf("b==%d %d\n",b[0],b[1]);
                
                
            }
        /*    for(i=0;i<=j;i++)
            {
                printf("%-8d ",a[i]);
            }    
            printf("\n");*/
            
            
            
        }
        //printf("y==%d\n",y);
            
            
        printf("%d\n",a[0]);
    }
        return 0;
}


0 0
原创粉丝点击