#include #include #include #define MAXN 110 #define MAXL 10000 unsigned long long int Min[MAXN][MAXN]; unsigned long long int Max[MAXN][MAXN]; int Number[MAXN]; char Op[MAXN]; char Buffer[MAXL]; unsigned long long int Count(unsigned long long int a, char op, unsigned long long int b) { if(op == '+') { return a + b; } else { return a * b; } } int main() { while(1) { memset(Min, 0, sizeof(Min)); memset(Max, 0, sizeof(Max)); scanf("%s", Buffer); if(Buffer[0] == 'E') { break; } int n = 0; for(int i = 0; 1; i++) { sscanf(Buffer + i, "%d", Number + n); while((Buffer[i] >= '0') && (Buffer[i] <= '9')) { i++; } if(!(Buffer[i])) { n++; break; } Op[n] = Buffer[i]; n++; } /*printf("Numbers:\n"); for(int i = 0; i < n; i++) { printf("%d ", Number[i]); } printf("\nOps:\n"); for(int i = 0; i < n - 1; i++) { printf("%c ", Op[i]); } printf("\n");*/ for(int i = 0; i < n; i++) { Min[1][i] = Number[i]; Max[1][i] = Number[i]; } for(int l = 2; l <= n; l++) { for(int i = 0; i <= n - l; i++) { unsigned long long int min = 1ULL << 63, max = 0, q; for(int j = 1; j < l; j++) { if((q = Count(Min[j][i], Op[(i + j) - 1], Min[l - j][i + j])) < min) { min = q; } if((q = Count(Max[j][i], Op[(i + j) - 1], Max[l - j][i + j])) > max) { max = q; } } Min[l][i] = min; Max[l][i] = max; } } /*for(int l = 1; l <= n; l++) { for(int i = 0; i <= n - l; i++) { printf("Max[%d][%d] = %llu\n", l, i, Max[l][i]); } }*/ printf("%llu %llu\n", Min[n][0], Max[n][0]); } return 0; }