题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)
https://www.luogu.org/problemnew/show/P1981
(原题链接)
显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归。可用普通的“从头扫到尾”的方法,以加号、乘号、及字符串尾的结束符(‘\0’)为间隔读入数字(因结尾没有符号,所以别忘了若不特别处理结尾,循环过完后会不处理最后读入的数)。
因数据会很大,题目善良的说“注意:当答案长度多于 4 位时,请只输出最后4 位,前导0 不输出”,有了这句话,我们的运算就只有后四位有关了(无论是加法还是乘法,能影响结果后四位的只有加数或因数的后四位),因此我们可以忽略第五位以后,即每次运算后都%10000。但就算2个数都小于10000,它们的和或积也有可能超过10000,因此在最后的结果别忘了再%10000。需用文件的同学最后也别忘了加上(或去掉)双斜线。
上代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
string suanshi;
int l,total=,g,i;
long long a[];
long long chengfa()
{
i++;
for(;i<=l;i++)
{
if(suanshi[i]>=''&&suanshi[i]<='')
a[g]=(a[g]*+suanshi[i]-'')%;
else
if(suanshi[i]=='+'||suanshi[i]=='\0')
{
g++;
return a[g-];
}
else
if(suanshi[i]=='*')
{
g++;
return a[g-]*chengfa()%;
}
}
}
int main()
{
cin>>suanshi;
l=suanshi.length();
g=;
for(i=;i<=l;++i)
{
if(suanshi[i]>=''&&suanshi[i]<='') a[g]=a[g]*+suanshi[i]-'';
else if(suanshi[i]=='+'||suanshi[i]=='\0')
{
total=(total+a[g]%)%;
g++;
}
else
if(suanshi[i]=='*')
{
g++;
total=total+a[g-]*chengfa()%;
}
}
cout<<total%;
return ;
}
题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)的更多相关文章
- 洛谷 P1981 表达式求值
P1981 表达式求值 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入输出格式 输入格式: 输入文件为 expr.in. 输入仅有一行,为需要你计算的表达式,表达式中只 ...
- 洛谷 P1981 表达式求值(模拟)
嗯... 题目链接:https://www.luogu.org/problem/P1981 这道题其实是数组模拟栈.首先处理乘法:注意从后往前处理,处理后归零.然后把数都加起来即可. AC代码: #i ...
- 洛谷P1981 表达式求值 题解 栈/中缀转后缀
题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...
- 洛谷p1981 表达式求值
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char ...
- P1981 表达式求值
P1981 表达式求值 题解 这个题联想一下 P1310 表达式的值 思路就是输入中缀式,转成后缀式,然后按后缀式计算,完美!! but!! 会严重RE,因为你可能会输入中缀式的时候输 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 【数据结构】P1981 表达式求值
题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入格式 一行,为需要你计算的表达式,表达式中只包含数字.加法运算符“++”和乘法运算符“×”,且没有括号,所有参与运算的数字 ...
- 洛谷 P1310 表达式的值 解题报告
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...
随机推荐
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...
- ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
一.前言 1.本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志 ASP.NET Core + NLog 将日志按自定义 ...
- DBA思考系列——凛冬将至,丧钟为谁而鸣!
诸多迹象昭示着凛冬将至,大萧条终于正式在全国各地拉开了序幕,很多80后的国人没有经历过苦日子,也没有经历过真正的金融危机.这场经济危机必将摧毁一些无视经济能力,盲目购房,盲目消费的家庭或个人.个人对经 ...
- LSB和MSB
最低有效位(the least significant bit,lsb)是指一个二进制数字中的第0位(即最低位),具有权值为2^0,可以用它来检测数的奇偶性.与之相反的称之为最高有效位.在大端序中,l ...
- STP生成树协议
STP主要作用 1.消除环路:通过阻断冗余链路来消除网络中可能存在的链路 2.链路备份:当活动那个路径发生故障时,激活备份链路,及时恢复网络连通性. 根桥选举 每个交换机启动STP后,都认为自己是根桥 ...
- RHEL6 删除软RAID
停止使用RAID: 1.umount raid组上的硬盘的所用的分区 若使用raid组创建vg,需要删除或去激活VG 2.停止raid服务 mdadm -S /dev/md0 3.清除MBR # md ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- Redis学习笔记(5)——Redis数据持久化
出处http://www.cnblogs.com/xiaoxi/p/7065328.html 一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存 ...
- 英特尔关闭PC计算卡项目—插个卡片就能升级个人电脑
在 2017 年的美国国际消费电子展上,电脑芯片巨头英特尔公司曾经推出一个名为“计算卡”的新产品,相当于把个人电脑的重要零部件整合到了一张信用卡大小的卡片设备中,未来用户升级个人电脑,只需要拔下旧卡片 ...
- 微信小程序 初步认识一(微信运动步数)
1.注册微信小程序 2.安装小程序开发工具 3.实例(显示微信运动步数) 4.后端处理(c#) 一 注册微信小程序 注册地址:https://mp.weixin.qq.com/cgi-bin/regi ...