300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > NYOJ 305 表达式求值

NYOJ 305 表达式求值

时间:2022-01-14 03:56:08

相关推荐

NYOJ 305 表达式求值

表达式求值

时间限制:3000ms | 内存限制:65535KB 难度:3描述

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

AC码:

#include<stdio.h>#include<string.h>int main(){int n,len,num[80],result[200];char str[305];scanf("%d",&n);while(n--){scanf("%s",str);len=strlen(str);int i=0,j=-1,sum=0,k=0,p;while(i<len){if(str[i]=='a'){num[++j]=1;i=i+4;}else if(str[i]=='m'){if(str[i+1]=='i')num[++j]=2;if(str[i+1]=='a')num[++j]=3;i=i+4;}else if(str[i]>='0'&&str[i]<='9'){sum=0;while(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}result[k++]=sum;}else if(str[i]==')'){p=num[j--];k--;if(p==1){result[k-1]=result[k]+result[k-1];}if(p==2)result[k-1]=result[k]>result[k-1]?result[k-1]:result[k];if(p==3)result[k-1]=result[k]>result[k-1]?result[k]:result[k-1];i++;}elsei++;}printf("%d\n",result[0]);}return 0;}

AC码:

#include<stdio.h>char str[1005];int i;int eval(){int x=0,a,b;while(str[i]==','||str[i]==')')i++;if(str[i+1]=='d'){i=i+4;return eval()+eval();}if(str[i+1]=='i'){i=i+4;a=eval();b=eval();return a<b?a:b;}if(str[i+1]=='a'){i=i+4;a=eval();b=eval();return a>b?a:b;}while(str[i]>='0'&&str[i]<='9'){x=x*10+str[i]-'0';i++;}return x;}int main(){int T;scanf("%d",&T);while(T--){scanf("%s",str);i=0;printf("%d\n",eval());}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。