#define eps 1e-8
char a[10], b[10], c[10], d[10],s[100];char operate[4] = {
'+','-','*','/'};int fin[1000];double dig[1000]; //数字栈
char ope[1000]; //运算符栈
int pri[1000]; //存储运算符优先级
int Create(char[], char[], char[], char[], char, char, char);int Calculate(char *);int getdig(int, int);double cal(double, double, char);int FullArray(int, int, int);void pop(void);doublemin;int flag,flagless = 0;intdigtop, opetop;intmain()
{inti, j, k;
pri['+'] = pri['-'] = 0;
pri['*'] = pri['/'] = 1;while(scanf("%s",a) !=EOF)
{
flag= flagless = 0;
min= 1000;
scanf("%s%s%s",b, c, d);
getchar();for (i = 0; i < 4; i++)
{if (flag == 1)break;for (j = 0; j < 4; j++)
{if (flag == 1)break;for (k = 0; k < 4; k++)
{if (FullArray(i,j,k) == 1)
{
printf("24.000\n");
flag= 1;break;
}
}
}
}if (flag == 0)
{if (flagless == 1)
printf("%.3f\n",24-min);elseprintf("%.3f\n",24+min);
}
}
}//构造由abcdijk组成的中缀表达式//入口参数:运算符//返回:中缀表达式是否构成了24点
int Create(char a[], char b[], char c[],char d[],char i, char j, chark)
{intl;for (l = 0; *(s+l) != '\0'; l++)*(s+l) = '\0';
strcpy(s,a);
s[strlen(s)]=i;
strcat(s,b);
s[strlen(s)]=j;
strcat(s,c);
s[strlen(s)]=k;
strcat(s,d);//printf("%s=",s);
if(Calculate(s) == 1)return 1;return 0;
}//计算s的值//入口参数:中缀表达式//返回:是否构成24点
int Calculate(char *s)
{
digtop= opetop = 0; //栈顶指针
int i, x, neg = 0; //neg == 1 负数
for (i = 0; *(s+i) != '\0'; i++)
{if (fin[i] == 0) //fin[i] = 1 表示第i位处理完毕
{if (s[i] >= '0' && s[i] <= '9') //数字直接入栈
{
x=getdig(i, neg);
neg= 0;
dig[++digtop] = (double)x;
}else{//两个符号相连,或者第一个字符是符号,证明遇到负数
if((i>0 && (!(s[i-1] >= '0' && s[i-1] <= '9')))||(i == 0))
neg= 1;else{if (opetop == 0) //运算符栈为空直接入栈
ope[++opetop] =s[i];else{while (pri[ope[opetop]] >= pri[s[i]] && opetop > 0)
pop();
ope[++opetop] =s[i];
}
}
}
}
}while (opetop > 0)
pop();if (fabs(dig[digtop]-24) < eps) //找到24点
return 1;if (fabs(dig[digtop]-24)
{
min= fabs(dig[digtop]-24);if (dig[digtop] < 24)
flagless= 1;elseflagless= 0;
}//printf("%.3f\n",dig[digtop]);
if (fabs(dig[digtop]-24) ==min)if (dig[digtop] < 24)
flagless= 1;for (i = 0; *(s+i) != '\0'; i++)
fin[i]= 0;return 0;
}//弹出两个元素运算//入口参数:无//返回:无
void pop(void)
{doublea, b;charc;
a= dig[digtop--];
b=dig[digtop];
c= ope[opetop--];
dig[digtop]=cal(a,b,c);
}//返回从第i位开始的数字//入口参数:数字的第一个字符在字符串s中的位置i//返回:数字
int getdig(int i, intneg)
{int x = s[i] - 48;
fin[i]= 1;while (1)
{
i++;if (i ==strlen(s))break;if (*(s+i) < '0' || *(s+i) > '9')break;
fin[i]= 1;
x*= 10;
x+= s[i] - 48;
}if (neg == 1)return x*(-1);returnx;
}//计算//入口参数:数 运算符//返回:结果
double cal(double x, double y, charc)
{switch(c)
{case '+':return x+y;case '-':return y-x;case '*':return x*y;case '/':if (x != 0)return y/x;
}return -100000;
}//全排列//入口参数:运算符//返回:构成24点返回1
int FullArray(int i, int j, intk)
{//a
if(Create(a,b,c,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(a,b,d,c,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(a,c,d,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(a,c,b,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(a,d,c,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(a,d,b,c,operate[i],operate[j],operate[k]) == 1) return 1;//b
if(Create(b,a,c,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(b,a,d,c,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(b,c,d,a,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(b,c,a,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(b,d,a,c,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(b,d,c,a,operate[i],operate[j],operate[k]) == 1) return 1;//c
if(Create(c,a,b,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(c,a,d,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(c,b,d,a,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(c,b,a,d,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(c,d,a,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(c,d,b,a,operate[i],operate[j],operate[k]) == 1) return 1;//d
if(Create(d,a,b,c,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(d,a,c,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(d,b,a,c,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(d,b,c,a,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(d,c,a,b,operate[i],operate[j],operate[k]) == 1) return 1;if(Create(d,c,b,a,operate[i],operate[j],operate[k]) == 1) return 1;return 0;
}