Description
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
Input
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“ +” 和乘法运算符“ *”,且没有括号, 所有参与运算的数字均为 0 到 231-1 之间的整数。 输入数据保证这一行只有 0~ 9、 +、 *这 12 种字符。
Output
输出只有一行,包含一个整数, 表示这个表达式的值。 注意: 当答案长度多于 4 位时,请只输出最后 4 位, 前导 0 不输出。
Sample Input
【输入样例 1】 1+1*3+4 【输入样例 2】 1+1234567890*1 【输入样例 3】 1+1000000003*1
Sample Output
【输出样例 1】8【输出样例 2】 7891【输出样例 3】4
HINT
【输入输出样例说明】
样例 1 计算的结果为 8, 直接输出 8。
样例 2 计算的结果为 1234567891, 输出后 4 位,即 7891。
样例 3 计算的结果为 1000000004, 输出后 4 位,即 4。
【数据范围】
对于 30%的数据, 0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据, 0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据, 0≤表达式中加法运算符和乘法运算符的总数≤100000。
Code:
#include <iostream> // 24ms Solution
#include <string>
#define SIZE 100001
using namespace std;
string a;
int num[SIZE];
char op[SIZE];
int main(int argc, char** argv)
{
long long res = 0, i = 0, temp = 0, n = 0;
cin >> a;
for ( ; ; ) // 分出运算符和数字
{
if ((a[i] == '+') || (a[i] == '*'))
{
op[++n] = a[i];
num[n-1] = temp;
temp = 0;
}
else
{
temp = temp * 10 + a[i] - '0';
temp %= 10000;
}
if (++i == a.size())
{
break;
}
}
num[n] = temp;
num[n] = temp;
temp = num[0];
for (i = 1; i <= n; i++)
{
if (op[i] == '+') // 加法,把上次乘得的积加上去
{
res += temp;
res %= 10000; // 防止越界
temp = num[i];
}
else // 乘法
{
temp *= num[i];
temp %= 10000;
}
}
printf("%d", (res % 10000 + temp % 10000) % 10000);
return 0;
}