nyoj1272表达式求值(递归法)
递归写的,类似于之前的一道,但要更难一点,因为加入了'+','*'以及括号运算符,所以要考录周全;
这道题给了我很大启示,在第一道德基础上;
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<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表达式求值(递归法)的更多相关文章
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值(河南省第四届ACM试题-C题)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定指定的一个由3种函数组成的表达式,计算其数值. [题目分析] 一开始以为是后缀表达式,后来抽了没想出来,最后用了递归的方法解 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...
- 【算法】E.W.Dijkstra算术表达式求值
算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- c/c++ 表达式求值
表达式求值 [问题描述] 一个算术表达式是由操作数(operand).运算符(operator)和界限符(delimiter)组成的.假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括 ...
- Aviator 表达式求值引擎开源框架
简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...
- lintcode-424-逆波兰表达式求值
424-逆波兰表达式求值 求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2" ...
随机推荐
- [分享] 采用opencv_cascadetrain进行训练的步骤及注意事项 [复制链接]
http://f.dataguru.cn/thread-725364-1-1.html 很有用的一个帖子 转自:http://blog.csdn.net/xidianzhimeng/article/d ...
- Linux下Tomcat端口、进程以及防火墙设置
Linux下Tomcat端口.进程以及防火墙设置 1,查看tomcat进程: #ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个 ...
- 20145225唐振远《网络对抗》Exp4 恶意代码分析
20145225唐振远<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪 ...
- codeforces 1097 Hello 2019
又回来了.. A - Gennady and a Card Game 好像没什么可说的了. #include<bits/stdc++.h> using namespace std; cha ...
- spring boot 多数据源分布式事务处理
有参考文章 ,但是自己没有测试.
- ElasticSearch 5.4 安装
1. 前期准备 环境准备 IP地址 操作系统 内存 192.168.1.10 centos 7 16 192.168.1.11 centos 7 16 192.168.1.12 centos ...
- WebForm、MVC、流式计算
11月.NET技术讨论会圆满结束,会议纪要及相关文档如下如下: 1.WebForm预编译演示 文档:http://gitlab.light.fang.com/kongguDonet.Demo/Pre ...
- 使用 PYTHON 为 PIP 搭建 HTTP 代理
在一台没有 Root 权限的机器上,部署使用 Python 编写的服务,似乎只有 virtualenv 一条路可以选了. 当然我见过一些同事会在自己的家目录编译一个,然后设置一下 $PATH ,但是从 ...
- xtu 1242 Yada Number 打表
Yada Number Time Limit : 2000 MS Memory Limit : 65536 KB Yada Number Problem Description: ...
- python 线性查找
import random val= data=[,,,,] : find= val=int(input('请输入查找键值(1-9),输入-1离开:')) for i in data: if i==v ...