表达式求值 第九届河南省赛

来源:互联网 发布:ubuntu 字库 编辑:程序博客网 时间:2024/05/16 10:57

问题 A: 表达式求值

时间限制: 1 Sec  内存限制: 64 MB
提交: 17  解决: 14
[提交][状态][讨论版]

题目描述

假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式。 2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+. 3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 值的各位数字之和,再从中选最大数。 4.如果 X 是 表达式,则 (X)也是表达式。 例如: 表达式 12*(2+3)+Smax(333,220+280) 的值为 69。 请你编程,对给定的表达式,输出其值。  

输入

【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

输出

【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。

样例输入

312+2*312*(2+3)12*(2+3)+Smax(333,220+280)

样例输出

1860

69

这是亮神思想全程递归

#include <stdio.h>#include<algorithm>#include<iostream>#include<cstring>using namespace std;char s[2003];int max(int a,int b){    if(a>b)    {        return a;    }    else    {        return b;    }}int jud(int a){    int sum=0;    while(a)    {        sum+=a%10;        a=a/10;    }    return sum;}int solve(char s[]){    int len;    len=strlen(s);    int k=0;    int b=0,t=0;  for(int i=0;i<len;i++)  {      if(s[i]=='(')         {             k++;         }      if(s[i]==')')      {          k--;      }      if(s[i]=='+'&&k==0)      {          s[i]='\0';          return (solve(s))+(solve(s+i+1));      }      if(s[i]=='*'&&k==0)      {          t=i;      }      if(s[i]==','&&k==1)      {          b=i;      }  }  if(t!=0)  {      s[t]='\0';      return solve(s)*solve(s+t+1);  }  if(b!=0)  {      s[b]='\0';     // s[len-1]='\0';      return max(jud(solve(s+5)),jud(solve(s+b+1)));  }   if(s[0]=='(')     {         s[len-1]='\0';         return solve(s+1);     }    return atoi(s);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        //int len;        scanf("%s",s);       cout<<solve(s)<<endl;;        //len=strlen(s);    //cout<<atoi(s)<<endl;    }    return 0;}


0 0
原创粉丝点击