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

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

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. 08: python基础练习题

    1.while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和 # 使用while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和 s = 0 i = ...

  2. Cortex-M3基础

    (一)寄存器 1 寄存器组      R0-R12: 通用寄存器 ------------------------------------------------------------------- ...

  3. 小测(noip2005的两道题) 2017.3.3

    过河 题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把 ...

  4. python字符串格式化之format

    用法: 它通过{}和:来代替传统%方式 1.使用位置参数 要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表 ...

  5. Python3基础 help 查看内置函数说明

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. Python3基础 os chdir 改变工作目录

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. 主引导记录MBR的结构和作用

    MBR磁盘分区都有一个引导扇区,称为主引导记录,英文简称为MBR.1. MBR的结构MBR扇区位于整个硬盘的第一个扇区:按照C/H/S地址描述,即0柱面〇磁头1扇 区:按照LBA地址描述即0扇区.它是 ...

  8. PyQt5 - 01 使用qt creator创建第一个pyqt5界面程序

    1. 安装Qt Creator qt creator下载点我 2. 利用Qt Creator创建界面 点击文件 -> 新建文件或项目 选择Qt -> Qt设计师界面类 选择一个模版,创建一 ...

  9. 【第九章】 springboot + mybatis + 多数据源 (AOP实现)

    在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...

  10. HDU 6125 Free from square(状态压缩+分组背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=6125 题意: 在${1,2,3,...n}$的数中选择1~k个数,使得它们的乘积不能被平方数整除(1除外),计算 ...