思路:
当先计算加法时,得到的是最大值,先计算乘法时,得到的是最小值。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 100
bool lowerPriority[45][45]; //lowerPriority[i][j]为真表示,运算符i的优先级低于运算符j
bool MinPriorityOp(char *E, char *end, char *&minPriorityOp)
{
bool exist = false;
char *i;
for (i = E; i != end; i++)
{
if (*i == '*' || *i == '+')
{
if (!exist)
{
minPriorityOp = i;
exist = true;
}
else if (lowerPriority[*i][*minPriorityOp])
{
minPriorityOp = i;
}
}
}
return exist;
}
long long Calc(char *E, char *end)
{
char *min = NULL; //指向优先级最低的运算符
if (!MinPriorityOp(E, end, min))
{
int val;
sscanf(E, "%d", &val);
return val;
}
switch (*min)
{
case '*': return Calc(E, min-1) * Calc(min+1, end);
case '+': return Calc(E, min-1) + Calc(min+1, end);
default: return -1;
}
}
int main(void)
{
lowerPriority['*']['*'] = true;
lowerPriority['+']['+'] = true;
char E[MAXN];
int ncases;
scanf("%d\n", &ncases);
while (ncases-- != 0)
{
gets(E);
//乘法的优先级低于加法
lowerPriority['*']['+'] = true;
lowerPriority['+']['*'] = false;
long long max = Calc(E, E+strlen(E));
//乘法的优先级高于加法
lowerPriority['*']['+'] = false;
lowerPriority['+']['*'] = true;
long long min = Calc(E, E+strlen(E));
printf("The maximum and minimum are %lld and %lld.\n", max, min);
}
return 0;
}