题意:给出只包含数字和+*的表达式,你可以自己安排每一个运算的顺序,让你找出表达式可能得到的最大值和最小值。
代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; string s; long long num1[20]; long long num2[20]; void deal1() { int j=0,i; num1[0]=0; int h = 0; while(s[j]>='0' && s[j]<='9') { num1[0] = num1[0]*10+(s[j]-'0'); j++; } int flag; int flag2; for(i=j; i<s.size(); i++) { long long temp = 0; flag2 = 0; while(s[i]>='0' && s[i]<='9') { temp = temp*10+(s[i]-'0'); i++; flag2=1; } if(flag2) { if(flag) num1[h]+=temp; else num1[++h] = temp; } if(s[i]=='+') { flag=1; }else flag=0; } long long sum=1; for(i=0; i<=h; i++) { sum *= num1[i]; } printf("%lld and ", sum); } void deal2() { int j=0,i; num2[0]=0; int h = 0; while(s[j]>='0' && s[j]<='9') { num2[0] = num2[0]*10+(s[j]-'0'); j++; } int flag; int flag2; for(i=j; i<s.size(); i++) { long long temp = 0; flag2 = 0; while(s[i]>='0' && s[i]<='9') { temp = temp*10+(s[i]-'0'); i++; flag2=1; } if(flag2) { if(flag) num2[h]*=temp; else num2[++h] = temp; } if(s[i]=='*') { flag=1; }else flag=0; } long long sum=0; for(i=0; i<=h; i++) { sum += num2[i]; } printf("%lld.\n", sum); } int main() { int n; scanf("%d", &n); while(n--) { cin>>s; printf("The maximum and minimum are "); memset(num1, 0, sizeof(num1)); memset(num2, 1, sizeof(num2)); deal1(); deal2(); } return 0; }