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

🏆今日学习目标:
🍀学习表达式求值题目
✅创作者:贤鱼
⏰预计时间:25分钟
🎉个人主页:贤鱼的个人主页
🔥专栏系列:c++
请添加图片描述

题目

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

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

请添加图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贤鱼不闲

一分钱也是爱!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值