递归写的,类似于之前的一道,但要更难一点,因为加入了'+','*'以及括号运算符,所以要考录周全;

这道题给了我很大启示,在第一道德基础上;

1!寻找括号的优先级,先找有没有不被任何括号夹住的加号,如果有将其两端递归,否则(此时说明没有空出来的加号)继续找有没有没被括号夹住的

‘×’号,如果有将乘号两端继续递归

#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
char s[1010];
LL judnum(int,int);
int judge(int ,int ,char);
LL all(LL);
LL dfs(int st,int ed)
{
int i,j,pp=judge(st,ed,'+'),pnum=judnum(st,ed),pc=judge(st,ed,'*');
   if(pnum!=-1)        return pnum;
   else if(pp!=-1) {LL t1=dfs(st,pp-1),t2=dfs(pp+1,ed);
                        return t1+t2;}

else if (pc!=-1){
    LL t1=dfs(st,pc-1),t2=dfs(pc+1,ed);
    return t1*t2;
}
else if(s[st]=='('&&s[ed]==')') return dfs(st+1,ed-1);
else if(s[st]=='S'){
int mid=judge(st,ed,',');
LL t1=dfs(st+5,mid-1),t2=dfs(mid+1,ed-1);
return max(all(t1),all(t2));
  }
}
LL all(LL a)
{
LL s=0;
while(a){
s+=a%10;
a/=10;}
return s;
}
LL judnum(int st,int ed)
{
int sum=0;
for(int i=st;i<=ed;++i)
{
if(!isdigit(s[i])) return -1;
else sum=sum*10+s[i]-'0';
}
return sum;
}
int judge(int st,int ed,char type)
{
    int c=0,pd=(type==','?1:0);
    for(int i=st;i<=ed;++i){
        if(s[i]=='(') ++c;
        else if(s[i]==')') --c;
        if(c==pd&&s[i]==type) return i;
    }
    return -1;
}
int main()
{
int t;
cin>>t;
while(t--) cin>>s,cout<<dfs(0,strlen(s)-1)<<endl;
return 0;
}

上面那个太傻逼了= =

 #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;
}

nyoj1272表达式求值(递归法)的更多相关文章

  1. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

  2. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  3. 表达式求值(河南省第四届ACM试题-C题)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定指定的一个由3种函数组成的表达式,计算其数值. [题目分析] 一开始以为是后缀表达式,后来抽了没想出来,最后用了递归的方法解 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)

    题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...

  5. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  6. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  7. c/c++ 表达式求值

    表达式求值 [问题描述] 一个算术表达式是由操作数(operand).运算符(operator)和界限符(delimiter)组成的.假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括 ...

  8. Aviator 表达式求值引擎开源框架

    简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...

  9. lintcode-424-逆波兰表达式求值

    424-逆波兰表达式求值 求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2" ...

随机推荐

  1. C/C++之内存分配

    一.编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误.2 ...

  2. ACM题目————STL练习之求次数

    题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=1112 描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个 ...

  3. vc编辑器常用设置

    代码格式化 1.选中代码: 2.ctrl+K: 3.ctrl+F; 显示行号

  4. 02: tornado进阶篇

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 自定制t ...

  5. 20145335郝昊《网络攻防》Exp4 Msf基础

    20145335郝昊<网络攻防>Exp4 Msf基础 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路. 一个主动攻击,如ms08_067; 一个针对浏览器的 ...

  6. Android移植学习笔记

    1.一头雾水不知道用什么编译环境,不知道用什么下载软件 编译软件:Ubuntu12.04(编译主机系统),JDK(Java) 下载软件: 模拟器: qemu

  7. 如何写出格式优美的javadoc?

    如果你读过Java源码,那你应该已经见到了源码中优美的javadoc.在eclipse 中鼠标指向任何的公有方法都会显示出详细的描述,例如返回值.作用.异常类型等等. 本文主要来自<Thinki ...

  8. jQuery ajax 添加头部参数跨域

    1.添加HTTP文件头 $.ajax({ url: "http://www.baidu.com", //contentType: "text/html; charset= ...

  9. 三羊献瑞|2015年蓝桥杯B组题解析第三题-fishers

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 三 羊 献 瑞 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写& ...

  10. java中子类实例化过程中的内存分配

    知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...