贪心算法,先算所有的乘法就是最小值,先算所有的加法就是最大值。
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
char buf[1000];
double num[20];
char oper[20];
//n表示数字的个数
void func(int n)
{
double max, min;
double temp;
vector<double> v;
double num_backup[20];
int i, j;
memcpy(num_backup, num, sizeof(double)*20);
v.clear();
for(i=1; i<=n-1; )
{
if(oper[i] == '*')
{
temp = num[i-1];
num[i-1] = 0.0;
for(j=i; j<=n-1; j++)
{
if(oper[j] == '*')
{
temp *= num[j];
num[j] = 0.0;
}
else
break;
}
v.push_back(temp);
i = j;
continue;
}
else
{
i++;
}
}
min = 0.0;
for(i=0; i<v.size(); i++)
min += v[i];
for(i=0; i<n; i++)
min += num[i];
memcpy(num, num_backup, sizeof(double)*20);
v.clear();
for(i=1; i<=n-1;)
{
if(oper[i] == '+')
{
temp = num[i-1];
num[i-1] = 1.0;
for(j=i; j<=n-1; j++)
{
if(oper[j] == '+')
{
temp += num[j];
num[j] = 1.0;
}
else
break;
}
v.push_back(temp);
i = j;
continue;
}
else
{
i++;
}
}
max = 1.0;
for(i=0; i<v.size(); i++)
max *= v[i];
for(i=0; i<n; i++)
max *= num[i];
printf("The maximum and minimum are %.0lf and %.0lf.\n", max, min);
}
int main(void)
{
int n, len;
int count, data;
char *start, *p_add, *p_mul, *p;
//freopen("input.dat", "r", stdin);
scanf("%d", &n);
while(n--)
{
scanf("%s", buf);
len = strlen(buf);
count = 1;
sscanf(buf, "%d", &data);
num[0] = data;
start = buf;
while(1)
{
p_add = strstr(start, "+");
p_mul = strstr(start, "*");
if(!p_add && !p_mul)
break;
if(p_add && p_mul)
p = p_add<p_mul ? p_add:p_mul;
else if(p_add)
p = p_add;
else
p = p_mul;
oper[count] = *p;
sscanf(p+1, "%d", &data);
num[count] = data;
start = p+1;
count++;
}
func(count);
}
}