【题解】【模拟】—— [NOIP2013 普及组] 表达式求值
- [NOIP2013 普及组] 表达式求值
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 输入 #1
- 输出 #1
- 输入 #2
- 输出 #2
- 输入 #3
- 输出 #3
- 提示
- 1.简单做法
- 1.1.题意解析
- 1.2.AC代码
- 2.使用栈的做法
- 2.1.题意解析
- 2.2.AC代码
[NOIP2013 普及组] 表达式求值
通往洛谷的传送门
题目背景
NOIP2013 普及组 T2
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 +
和乘法运算符 *
,且没有括号,所有参与运算的数字均为
0
0
0 到
2
31
−
1
2^{31}-1
231−1 之间的整数。
输入数据保证这一行只有 0123456789+*
这
12
12
12 种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 4 4 4 位时,请只输出最后 $ 4$ 位,前导 $ 0$ 不输出。
输入输出样例
输入 #1
1+1*3+4
输出 #1
8
输入 #2
1+1234567890*1
输出 #2
7891
输入 #3
1+1000000003*1
输出 #3
4
提示
对于 30 % 30\% 30% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100 ≤100 ≤100。
对于 80 % 80\% 80% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 1000 ≤1000 ≤1000。
对于 100 % 100\% 100% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100000 ≤100000 ≤100000。
1.简单做法
1.1.题意解析
我们可以将这道题看成多个乘法算式的和,那么就很好做了。
定义一个变量num
,存储当前段的乘积。定义一个变量ans
,存储答案。
先读入第一个数。然后循环分别读取一个符号
t
m
p
tmp
tmp和一个数字
x
x
x,如果读入的符号是*
,就用num*x
。否则就ans+=num
,num=x
。
注意:
1)要对最后的乘积段进行额外处理;
2)每一步都要对10000
取模。
1.2.AC代码
#include<bits/stdc++.h>
using namespace std;
#define mod 10000
int x,ans,num;//ans为答案,num为当前段乘积,x为当前数
char tmp;//计算符号
int main()
{
scanf("%d",&num);
while(scanf("%c",&tmp)&&tmp!='\n')
{
scanf("%d",&x);
if(tmp=='*')num=(num*x)%mod;//每一步都要对10000求余
else ans=(ans+num)%mod,num=x;
}
printf("%d",(ans+num)%mod);//计算最后的和
return 0;
}
2.使用栈的做法
2.1.题意解析
不会栈的同学可以先走一步了。
和上面的做法类似,将所有的乘积段压入栈,最后统一取出求和。
2.2.AC代码
#include<bits/stdc++.h>
using namespace std;
#define mod 10000
int x,ans,num;//ans为答案,num为当前段乘积,x为当前数
char tmp;//计算符号
stack<int>s;
int main()
{
scanf("%d",&num);
while(scanf("%c",&tmp)&&tmp!='\n')
{
scanf("%d",&x);
if(tmp=='*')num=(num*x)%mod;//每一步都要对10000求余
else s.push(num),num=x;
}
ans=num;
while(!s.empty())
ans=(ans+s.top())%mod,s.pop();
printf("%d",ans%mod);//计算最后的和
return 0;
}
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育