表达式求值【NOIP2013普及组】

news/2025/1/16 1:03:19/

表达式求值【NOIP2013普及组】

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入输出格式

输入格式:

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。

输出格式:

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,
请只输出最后 4 位,前导 0 不输出。

输入输出样例

输入样例:

【输入样例 1】

1+1∗3+41+1*3+41+13+4

【输入样例 2】

1+1234567890∗11+1234567890*11+12345678901

【输入样例 3】

1+1000000003∗11+1000000003*11+10000000031

输出样例:

【输出样例 1】

888

【输出样例 2】

789178917891

【输出样例 3】

444

提示信息

【输入输出样例说明】

  • 样例 1 计算的结果为 8,直接输出 8。
  • 样例 2 计算的结果为 1234567891,输出后 4 位,即 7891。
  • 样例 3 计算的结果为 1000000004,输出后 4 位,即 4。

【数据范围】

  • 对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
  • 对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
  • 对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

想法:

我的思路非常简单,用的方法就很简单,先输入一个字符串,然后逐个将字符存入两个数组shuzishuzishuzifuhaofuhaofuhao总,分别表示数字和符号。
然后枚举每一位数和符号,先算乘法,将算过的数标记一下,在算加法就行了~~

XXX小天狼星唉,我去,为什么你不用栈结构呢???多方便呀!!想了想唉,不是,我比赛的时候一时没想到吗??XXX小天狼星

代码:

代码可简单了~

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
long long l,t,S,F,fuhao[200000],shuzi[200000];
string a;
int main()
{//freopen ("expr.in","r",stdin);//freopen ("expr.out","w",stdout);cin >>a; l=a.size();for (int i=0;i<l;i++){if (!t){shuzi[++S]=shuzi[S]*10+a[i]-48;t=1;}else{if (a[i]>='0' && a[i]<='9')shuzi[S]=shuzi[S]*10+a[i]-48;else{shuzi[S]%=10000;if (a[i]=='+')fuhao[++F]=1;elsefuhao[++F]=2;t=0; }}}for (int i=1;i<=F;i++){if (fuhao[i]==2){fuhao[i]=-1;shuzi[i+1]*=shuzi[i];shuzi[i+1]%=10000;shuzi[i]=-1;}}int i=1,t1=1,t2=2;while (i<=F){while (shuzi[t1]==-1) t1++;while (shuzi[t2]==-1 || t2<=t1) t2++;while (fuhao[i]==-1) i++;if (fuhao[i]==1){shuzi[t2]+=shuzi[t1];shuzi[t2]%=10000;shuzi[t1]=-1;fuhao[i]=-1;}}cout <<shuzi[S];
//	fclose(stdin);
//	fclose(stdout);return 0;
}

只有60多行,是不是很“短”呀?
但是你如果直接抄代码,你会发现,此代码在比较新的编译器下会全部错误答案,但在比较旧的编译器下可以AC!!
为什么呢?
这就涉及到编译器的问题了:
我们看第17行,shuzi[++S]=shuzi[S]∗10+a[i]−48;shuzi[++S]=shuzi[S]*10+a[i]-48;shuzi[++S]=shuzi[S]10+a[i]48;
这一句在不同的编译器中会用不同的机器语言呈现:
1、旧版编译器:首先S增加1,然后计算后面的一串东西,然后再将这一串的结果存入数组中。
2、新版编译器:首先计算后面的一串东西,然后S增加1,然后将这一串的结果存入数组中。
这就导致计算的时候S还是旧的值,并没有+1,因此会得出错误的答案。
怎么改呢?
很简单,只要将第17行的

shuzi[++S]=shuzi[S]∗10+a[i]−48;shuzi[++S]=shuzi[S]*10+a[i]-48;shuzi[++S]=shuzi[S]10+a[i]48;

改为两行:

S++;S++;S++;
shuzi[++S]=shuzi[S]∗10+a[i]−48;shuzi[++S]=shuzi[S]*10+a[i]-48;shuzi[++S]=shuzi[S]10+a[i]48;

就可以了~
下面给出完整代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
long long l,t,S,F,fuhao[200000],shuzi[200000];
string a;
int main()
{//freopen ("expr.in","r",stdin);//freopen ("expr.out","w",stdout);cin >>a; l=a.size();for (int i=0;i<l;i++){if (!t){S++; shuzi[S]=shuzi[S]*10+a[i]-48;t=1;}else{if (a[i]>='0' && a[i]<='9')shuzi[S]=shuzi[S]*10+a[i]-48;else{shuzi[S]%=10000;if (a[i]=='+')fuhao[++F]=1;elsefuhao[++F]=2;t=0; }}}for (int i=1;i<=F;i++){if (fuhao[i]==2){fuhao[i]=-1;shuzi[i+1]*=shuzi[i];shuzi[i+1]%=10000;shuzi[i]=-1;}}int i=1,t1=1,t2=2;while (i<=F){while (shuzi[t1]==-1) t1++;while (shuzi[t2]==-1 || t2<=t1) t2++;while (fuhao[i]==-1) i++;if (fuhao[i]==1){shuzi[t2]+=shuzi[t1];shuzi[t2]%=10000;shuzi[t1]=-1;fuhao[i]=-1;}}cout <<shuzi[S];
//	fclose(stdin);
//	fclose(stdout);return 0;
}

看我这么细心,给我一个三连吧~~


http://www.ppmy.cn/news/12861.html

相关文章

一、构建自己的图像分类数据集(Datawhale组队学习)

文章目录安装配置环境图像采集采集函数爬取一类图片爬取多类图片一些参考类别的关键词制作图像分类数据集的注意事项删除多余文件删除系统自动生成的多余文件删除gif格式的图像文件删除非三通道的图像统计图像尺寸、比例分布采用的数据集统计数据集的基本信息可视化图像尺寸分布…

使用隐马尔科夫模型实现分词

文章目录算法概述算法实现参考结论参考资料参考链接算法概述 分词算法常用的方法是基于统计的机器学习算法。可以使用 隐马尔科夫模型&#xff08;HMM&#xff09; 来实现分词。 隐马尔科夫模型的基本思想是假设一个序列是由一个隐藏的马尔科夫链生成的&#xff0c;而每个状态…

Chrome V3版开发教程使用Vue 3.x+Ant构建项目

简介 ​ Google在2023年将会遗弃V2版本&#xff0c;而目前在CSDN平台上的大部分Chrome插件的开发教程都是基于V2版本的&#xff0c;V3版本和V2的版本上还是有很大的区别&#xff0c;就比如manifest.json中的写法差距就很大&#xff0c;所以对于即将要开发Chrome插件的小伙伴来…

操作系统之光--鸿蒙

鸿蒙是什么&#xff1f;鸿蒙包含Openharmony和harmonyOS。Openharmony是华为向开放原子开源基金会捐赠了鸿蒙开源部分的代码&#xff0c;归属于开放原子开源基金会。HarmonyOS是基于Openharmony的商业发行版本。目前大家华为手机上运行就是它。鸿蒙能做什么&#xff1f;很明显&…

数据结构设计--《五子棋》对弈程序

手敲800多行代码,搞了6个小时,终于写完了五子棋博弈问题,艰难!(以下纯属个人思路,仅供参考,创作不易,禁止搬运) 希望对大家有帮助。 1.课题要求 还记得我们在第一章 见过的“人机对弈”那个例子吗?现在就请你利用自己所学的知识,设计一一个“ 五子棋”对弈程序吧。注意:…

【青训营】Go的依赖管理

Go的依赖管理 本节内容来自于&#xff1a;字节跳动青年训练营第五届 后端组 1.什么是依赖 实际开发的工程需要使用许多第三方库&#xff0c;这能够使得我们站在巨人的肩膀上&#xff0c;使用第三方库中封装好的函数&#xff0c;可以大大方便我们的程序开发&#xff0c;第三方…

mysql 分库分表、 分区(partition)、sharding-sphere 综合整理

引言&#xff1a; 一般情况下&#xff0c;如果单表数据量超过2000w的样子查询速度会很慢&#xff0c;因为内存无法存储其索引&#xff0c;使得之后的 SQL 查询会产生磁盘 IO&#xff0c;从而导致性能下降。解决方案&#xff1a;mysql 分区 、 分表处理 分库分表&#xff1a; 原…

Python【r e】模块正则表达式[中]实战

正则表达式相关函数和符号用法&#xff1a;#正则表达式""".匹配任意某个字符[.]与转义字符的作用一致&#xff0c;表示匹配.,配合 &#xff0c;[.],即匹配一次或则多次. text . 或则 text ...2.从头匹配或者从左往右匹配re.match()"""import …