比较简单地题,也算是用到了一点贪心的思想。
由于所有的数字都是大于零的,不难发现,一个数字作为一个乘数的一部分,也就是先算加法时,比它作为加数时对于总和的贡献绝对不会更小。也就是先算所有加法时是最大值,先算所有乘法时是最小值。
忽略了总和可能高达20^12=4096000000000000,用int存储结果wa了一次,改用long long ac了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[100];
long long get1(long long front,long long rear)
{
long long product=1,i,j,t,value;
for(i=j=front;;i++)
{
if(s[i]=='*'||i==rear+1)
{
value=0;
for(t=j;t<=i-1;t++)
{
value=value*10+s[t]-'0';
}
//printf("a%d\n",value);
product*=value;
j=i+1;
if(i==rear+1)
break;
}
}
return product;
}
long long get2(long long front,long long rear)
{
long long sum=0,i,j,t,value;
for(i=j=front;;i++)
{
if(s[i]=='+'||i==rear+1)
{
value=0;
for(t=j;t<=i-1;t++)
{
value=value*10+s[t]-'0';
}
//printf("a%d\n",value);
sum+=value;
j=i+1;
if(i==rear+1)
break;
}
}
return sum;
}
int main()
{
long long t,i,j,min,max,len;
scanf("%lld",&t);
getchar();
while(t--)
{
scanf("%s",s);
len=strlen(s);
min=0,max=1;
for(i=0,j=0;i<=len;i++)
{
if(s[i]=='+'||s[i]==0)
{
//printf("b%d %d\n",j,i-1);
min+=get1(j,i-1);
j=i+1;
}
}
for(i=0,j=0;i<=len;i++)
{
if(s[i]=='*'||s[i]==0)
{
//printf("b%d %d\n",j,i-1);
max*=get2(j,i-1);
j=i+1;
}
}
printf("The maximum and minimum are %lld and %lld.\n",max,min);
}
return 0;
}