注意,这道题的代码不是我写的,是别人(ptyz219)写的,我只是根据他的代码想到了思路而已
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“×”,且没有括号,所有参与运算的数字均为 0 到 231−1 之间的整数。
输入数据保证这一行只有0−9、+、×这 12种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 4 位时,请只输出最后4 位,前导0 不输出。
样例数据
样例输入#1
1+1*3+4
样例输出#1
8
样例输入#2
1+1234567890*1
样例输出#2
7891
样例输入#3
1+1000000003*1
样例输出#3
4
数据范围
对于 30%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100;
对于 80%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000;
对于 100%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000。
---------------------------------------------------------------------------------------------------------------------------------
思路
首先,我们解题需要有思路,那这道题的思路是什么呢?
我们发现,输入是会输入大于9的数的,所以,如果我们输入的时候,把数字当字符来处理,会有些麻烦(因为数字不止一位,我们需要知道数字的输入是什么时候结束,还要把字符转成数字),所以,懒惰的我们当然会选择直接输入数字,我们当然是怎么方便怎么来了
所以,我们可以这样输入:先读入一个数字,然后开始循环,每次循环读入一个字符和一个数字
接下来,我们就因该进行计算了,我们来分析一下,这道题的难点就在于:乘法要比加法先算。我们想一下,我们在读入的时候,遇到乘法是不是可以直接计算?为什么呢?因为这道题中,输入保证没有括号,而加法一定是在乘法算完之后计算的,因此,我们在输入时遇到乘法,我们就直接计算
我们再想一下,我们在输入的时候就把乘法都算完了,那我们最后存下来的那些数字,是不是肯定是进行加法计算?因为除了乘法就是加法,乘法算完了,我们就可以把所有数字加起来,就能得到这道题的答案(看完思路,是不是觉得这题也很简单?)
---------------------------------------------------------------------------------------------------------------------------------
代码
下面是代码(别人的代码)
//答案来自ptyz219
#include<bits/stdc++.h>
using namespace std;
stack<int>x;
int a,b;
char c;
int main(){
ios::sync_with_stdio(NULL);//加速
cin.tie(NULL);cout.tie(NULL);//加速
cin>>a;//读入a,因为刚开始一定会输入一个数字
for(x.push(a%10000);cin>>c>>b;x.push(b))
//将a后4位入栈,读入要计算的符号和下一个数字,将下一个数字入栈
//可能有人不知道读入怎么停下来,我解释一下,读入停下来的时候,就是读到换行的时候
//我们如果用cin来读入换行,我们会读到一个空白字符
//而cin读到空白字符就会返回false,循环就停下来了
if(c=='*'){//如果符号是乘号
a=x.top();//获取栈顶
x.pop();//将栈顶弹出
b=a*b%10000;//算出乘法的答案
}
for(a=0;x.size();x.pop())
//就是循环x.size次,次数增加一次,x就弹出一次栈顶
a=(a+x.top())%10000;//a这时为答案,把a和栈顶加起来
//(因为乘法都算完了,所以剩下的肯定都是加法)
cout<<a;
return 0;
}
怎么样?这道题还是很简单的吧?