jzoj表达式求值【数论】

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


>Input
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“++”和乘法运算符“ \times ×”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。

输入数据保证这一行只有 0−9、+、×这 12 种字符。

>Output
一个整数,表示这个表达式的值。

注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。


>Sample Input
1+1000000003*1

>Sample Output
4


>解题思路
由于最后只有求后四位,所以每个数都只取后四位来计算。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105;
int ans,sum,t[2]; //所有乘法都变为t[0]*t[1],t[0]为多个数的乘积,t[1]暂时存另一个因数
string s;
int main()
{
	//freopen("expr.in","r",stdin);
	//freopen("expr.out","w",stdout);
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]>='0'&&s[i]<='9') t[sum]=t[sum]%1000*10+s[i]-'0'; 
		//如果是数字的话把数字存入当前数字的最后一位(只要四位)
		else
		{
			if(sum==1) t[0]=t[0]*t[1]%10000,sum=t[1]=0; //如果有第二个因数的话,两数压缩为一个数
			if(s[i]=='*') sum=1; //还有因数
			if(s[i]=='+')
			{
				ans=(ans+t[0])%10000; //累加
				sum=t[0]=t[1]=0; //重新记录
			}
		}
	}
	if(sum==1) t[0]=t[0]*t[1]%10000;
	printf("%d",(ans+t[0])%10000);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/94709944