信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、摸运算、模运算性质、栈

news/2024/10/2 16:22:39
PDF文档公众号回复关键字:20241002

**1 P1981 [NOIP2013普及组] 表达式求值 **

[题目描述]

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值

[输入格式]

一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “+” 和乘法运算符 “×”,且没有括号,所有参与运算的数字均为 0 到 2^31之间的整数。

输入数据保证这一行只有 0∼9、+、× 这 12种字符

[输出格式]

一个整数,表示这个表达式的值。

注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出

[输入输出样例]

输入 #1

1+1*3+4

输出 #1

8

输入 #2

1+1234567890*1

输出 #2

7891

输入 #3

1+1000000003*1

输出 #2

4

说明/提示

对于 30% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100。

对于 80% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000。

对于 100% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000。

2 相关知识点

1) 模运算

模运算,就是取余数,在计算机语言中用%来表示。举个简单的例子,3 % 5 = 3。结果的取值范围在 0 与模之间

例如

c=x/y

c=3 mod 5 =3 c的取值范围 [0,y-1]

结果也可以用负数表示,即 c=-2

2) 模运算性质

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p ) % p

(a * b) % p = (a % p * b % p) % p

a ^ b % p = ((a % p)^b) % p

3) 栈

栈又名堆栈,是一种限定仅在表尾进行插入和删除操作的线性表,这一端称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出的原则

4) 中缀表达式

是一种常见的算术表达式表示方法,其中运算符位于操作数之间

例如

//示例1
3 + 4 * 2
//示例2
(1 + 2) * (3 - 4)

3 思路分析

由于本题只有2个操作数,+和*,且*的优先级大于+
因此可以提前先把*计算出来,剩余都是+运算符,再统一计算加
例如如下表达式,具体步骤如下
1+1*3+4
每次输入一个操作符和一个操作数
遇到*号,从栈中取出栈顶操作数和本次读取的操作数相乘
相乘的结果存入栈中

2读入下一个操作符+和操作数4
直接把4放入栈中

3 栈中3个操作数只剩下1种操作符+
遍历栈对这3个操作数相加,即为表达式的值

示例程序

#include<bits/stdc++.h>
using namespace std;
/*
栈 
1 存储 *前的操作数和相乘后的结果 
2 存储 + 号前后的操作数 
*/ 
stack<int> st; 
int f,t,ans;//f第1个操作数 t第2个操作数 ans运算结果 
char s;//操作符 
const int m=10000;//只输出最后4位,结果对m取模 
int main(){cin>>f;//输入第1个操作数 st.push(f%10000);//根据模运算乘法和加法性质,可以先取模 while(cin>>s>>t){//输入操作符号和第2个操作数,直到结束 if(s=='*'){//乘法提前计算结果,再存入栈,保证栈中只保留加法运算 f=st.top();//从栈中取出第1个操作数 st.pop();//弹出上面取出的操作数 /*把结算结果存入栈,后续把结果相加 根据模运算加法性质,可以先取模 */st.push(f*t%m);}else{//加法操作符 直接存入栈,后续取出相加 st.push(t);}}//遍历栈,栈中保留的都是加法操作数,可以直接相加 while(st.size()!=0){//遍历栈,直到没有任何元素 ans=(ans+st.top())%m;//把栈中每个数累加到ans st.pop();//累加后 从栈中弹出 }cout<<ans;//输出运算结果 return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

模拟赛总结(二)

2024.8.1 T1 集合(mex.cpp) 枚举每个数,求他是\(mex\)的概率,就是取完比他小的,比他大的随便取的方案数比上总方案数 code T2 取模(mod.cpp) 有点套路 定义:\(odd\)为奇数,\(even\)为偶数,\(num_{odd}\)或者\(t\)为奇数个数 那个下取整可以变为: \[\begin{cases}& \…

重生之我要做商城 - 萌音商城V1.0上线

萌音系列的第N+1个项目来了呢. 这其实又是一个鸽了好几年的项目了,这回总算能把坑填上了. 先上项目地址: https://MoeKoe.cn 我为什么一直在做项目? 这个问题就很有意思了,为什么一直在做各种项目,而且还是不挣钱的东西. 接触过我之前一些项目的小伙伴都知道我开发什么项目都是…

【转戴】Redhat与Debian系介绍(Linux各种发行版本概述)

Linux,最早由Linus Benedict Torvalds在1991年开始编写。在这之前,Richard Stallman创建了Free Software Foundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(此类程序的许可方式均为GPL: General Public License)。在不断的有杰出的程序员和开发者加入到GNU组织中…

吐槽随笔

2024/10/02 好不容易有时间打一次洛谷月赛,结果却让我输的这么彻底!

【动态Web API学习(三)】动态方法

1.应用程序模型 ASP.NET Core MVC根据控制器、操作、操作参数、路由和筛选器的结果,定义模型如下: ApplicationModel、控制器(ControllerModel)、操作(ActionModel)和参数(ParameterModel)。上一节中只是告诉系统封哪个是控制器,还要为控制器模型初始化值,比如路由、…

关于Arch Linux 安装及一些相关问题总结

关于个人Arch Linux 安装及相关问题总结 0. 其它记得在pacstrap前换国内的源 不会有人和我一样没换等半天还不成功吧 😦交换分区开大一点,照着Windows下开(看taskmgr里面的缓存空间),比如4G的RAM就要开10G的swap,swap越大越不容易卡死,安装时用swapon启用你刚建的swap…

深度学习(可视化卷积核)

可视化卷积核参数对理解卷积神经网络的工作原理、优化模型性能、提高模型泛化能力有一定帮助作用。 下面以resnet18为例,可视化了部分卷积核参数。import torchvision from matplotlib import pyplot as plt import torchmodel = torchvision.models.resnet18(pretrained=True…

《痞子衡嵌入式半月刊》 第 108 期

痞子衡嵌入式半月刊: 第 108 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…