【题目描述】

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

【输入描述】

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“∗”,且没有括号,所有参与运算的数字均为 0到 $2^{31}-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

【样例说明】

样例 1 计算的结果为 8,直接输出 8。

样例 2 计算的结果为 123456789,输出后 4位,即 7891。

样例 3 计算的结果为 1000000004,输出后 4 位,即 4。

【数据范围】

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

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

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

【分析】

1.题目中已经告知,输入的数据只包含0~9,“+”和“*”这几个字符,也就是不用考虑其他特殊字符了。而且表达式中没有括号,减少了不少难度。

2.加号和乘号有优先级问题,加号在前乘号在后

3.比较麻烦的一点是当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。这个操作直接 模10000即可。

4. 本题所有参与数据的数字都在0~$2^{31}-1$范围内,int的范围$2^{31}$,10位数,遇到乘法和加法会超范围,如果要做运算的话建议用long long

5.题目要求输出表达式的值,换句话说,题目的输入数据应该是保证有解的,不会出现 “1++1024”这样的表达式。

【解题思路1】

由于题目描述的过程是一个比较规律的过程,一个数字一个符号,直到最后读不到为止,那么实际上这个过程只有加法和乘法,我们可以每次遇到“+”的符号就把前面的累计求和,遇到“*”的符号就先乘再求和,加法用来加每次的乘积。这样功能就比较好划分了。

【参考代码1】

#include<cstdio>
#include<iostream>
using namespace std;

int sum=0,num,tmp;  //定义和,要操作的数,临时数 
int main()
{
	char op;  //定义操作符 
	scanf("%d",&num);  //首先读入一个数字,之后就是一个符号和一个数字的格式
	while(scanf("%c",&op) && op !='\n')   //没有遇到回车符就继续读入
	{
		scanf("%d",&tmp);  //读入第二个数,根据上面的符号进行下面的操作
		if(op == '+')
		{
			sum=(sum+num)%10000; //遇到加号就加上上一段的值, 
			num=tmp;  //将每次读入的数 赋值给num 
		}
		else //除了加号就是乘号 
		{
			num=(num*tmp)%10000;  //遇到乘号先把两个数乘起来 
		}
	} 
	sum=(sum+num)%10000; //因为我们每次都是先读取符号再操作上一步的值,所以要加上最后一步操作的值。 
	printf("%d",sum);
	
	return 0; 
}

返回目录:NOIP/CSP信息学奥赛复赛