题意:一个算式,运算符只有加号和乘号,要求输出随意加括号后得到最大值和最小值。
题解:最大值加号优先级比乘号大,最小值乘号优先级比加号大,所以求最大值先算加号,再算乘号,最小值反之。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
double val[15];
char ope[15];
int mapp[15];
string str;
int main() {
int t;
scanf("%d", &t);
getchar();
while (t--) {
getline(cin, str);
memset(mapp, 0, sizeof(mapp));
int len = str.size();
int n = 0, m = 0;
double minimum = 0, maximum = 1;
for (int i = 0; i < len; i++) {
double temp = 0;
while (isdigit(str[i])) {
temp = temp * 10 + str[i] - '0';
i++;
}
val[n++] = temp;
ope[m++] = str[i];
}
m--;
double temp1;
int flag;
for (int i = 0; i < m; i++) {
temp1 = 1, flag = 0;
while (ope[i] == '*') {
flag = 1;
temp1 *= val[i];
mapp[i] = 1;
i++;
}
if (flag) {
temp1 *= val[i];
mapp[i] = 1;
minimum += temp1;
}
}
for (int i = 0; i < n; i++)
if (!mapp[i])
minimum += val[i];
memset(mapp, 0, sizeof(mapp));
for (int i = 0; i < m; i++) {
temp1 = flag = 0;
while (ope[i] == '+') {
flag = 1;
temp1 += val[i];
mapp[i] = 1;
i++;
}
if (flag) {
temp1 += val[i];
mapp[i] = 1;
maximum *= temp1;
}
}
for (int i = 0; i < n; i++)
if (!mapp[i])
maximum *= val[i];
printf("The maximum and minimum are %.0lf and %.0lf.\n", maximum, minimum);
}
return 0;
}