300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > NYOJ 1272:表达式求值(河南省ACM-A)

NYOJ 1272:表达式求值(河南省ACM-A)

时间:2019-02-24 20:47:25

相关推荐

NYOJ 1272:表达式求值(河南省ACM-A)

表达式求值

时间限制:1000ms | 内存限制:65535KB 难度:3描述假设表达式定义为: 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)

样例输出

186069

解题思路:将复杂的表达式分解为几个简单的表达式并计算,这样整个表达式的和可以通过这些子表达式而算出

过程:①寻找当前处于同一优先级的‘+’,即U = A+B(其中U、A、B都为表达式)

②若‘+’没有找到,则寻找当前处于同一优先级的'*',即U = A*B

③如果都没有找到说明当前表达式完全被括号覆盖,首字符只有可能是以下三种,如果是'('或'S'就直接递归

内层,如果是数字则直接返回这个数字即可

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char str[1005];int Jud(int l, int r);int Change(int t);int main(void){int T, len;scanf("%d", &T);while(T--){scanf("%s", str+1);len = strlen(str+1);printf("%d\n", Jud(1, len));}return 0;}int Jud(int l, int r){int i, k;k = 1;for(i=l;i<=r;i++){if(str[i]=='(')k++;if(str[i]==')')k--;if(str[i]=='+' && k==1)return Jud(l, i-1)+Jud(i+1, r);}k = 1;for(i=l;i<=r;i++){if(str[i]=='(')k++;if(str[i]==')')k--;if(str[i]=='*' && k==1)return Jud(l, i-1)*Jud(i+1, r);}if(str[l]=='(')return Jud(l+1, r-1);if(str[l]>='0' && str[l]<='9'){sscanf(str+l, "%d", &k);return k;}k = 1;for(i=l+5;i<=r-1;i++){if(str[i]=='(')k++;if(str[i]==')')k--;if(str[i]==',' && k==1)return max(Change(Jud(l+5, i-1)), Change(Jud(i+1, r-1)));}}int Change(int t){int sum;sum = 0;while(t!=0){sum += t%10;t /= 10;}return sum;}

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