🏆今日学习目标:
🍀学习表达式求值题目
✅创作者:贤鱼
⏰预计时间:25分钟
@TOC
题目
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “+” 和乘法运算符 “×”,且没有括号,所有参与运算的数字均为 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
输出 #3复制
4
说明/提示
对于 30% 的数据,0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤100。
对于 80% 的数据,0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000。
对于 100% 的数据,0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000。
思路
题目中明确说明了只有 和+,优先众所周知,所以我们可以优先处理 ,假设这个是 ,那么他前后的数字就要相乘,我们让i+1=i*(i+1)个数字,这样子可以避免连续乘号导致出现错误,我们在最后再将所有答案全部相加就好了(注意题目要求只输出4位,所以我们每次处理%10000和最后答案%10000就可以完美处理)
AC代码
#include<cmath>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int ans=0,a;
char s[100001000];//储存输入内容(貌似不需要这么大。。)
char fh[101010000];
int num[101010100];//上头的fh是单独储存所以的运算符,这个num是储存所有的数字
int main(){
cin>>s;
int nn=0,f=0;
int len=strlen(s);
for(int i=0;i<=len;i++){
if(isdigit(s[i])){//这个的意思是判断是不是数字
a=a*10+s[i]-'0';//储存数字
}else{
nn++;
num[nn]=a;
f++;
fh[f]=s[i];//这里放入数字和符号,记得数字清零
a=0;
}
}
for(int i=1;i<=f;i++){
if(fh[i]=='*'){ //如果是*,就按照上文所说处理
num[i+1]=num[i]*num[i+1];
num[i]=0;
num[i+1]%=10000;//每一次都摸一下
}
}
for(int i=1;i<=nn;i++){
ans+=num[i];
}
cout<<ans%10000;//输出的时候摸一下,前导零自动就排除掉了,不需要单独处理
}