0
点赞
收藏
分享

微信扫一扫

贤鱼的刷题日常--P1981 [NOIP2013 普及组] 表达式求值

@​​TOC​​

题目

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。 输入格式 一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “+” 和乘法运算符 “×”,且没有括号,所有参与运算的数字均为 0 到 2^31 之间的整数。 输入数据保证这一行只有 0-9、+、× 这 12种字符。 输出格式 一个整数,表示这个表达式的值。 注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。 输入输出样例 输入 #1复制 1+13+4 输出 #1复制 8 输入 #2复制 1+12345678901 输出 #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;//输出的时候摸一下,前导零自动就排除掉了,不需要单独处理
}

🏆结束语:如果有需要可以订阅一下专栏,持续更新内容!

贤鱼的刷题日常--P1981 [NOIP2013 普及组] 表达式求值_运算符_02

举报

相关推荐

NOIP2013普及组复赛 解题分析

0 条评论