样例过了,这题就A了,像这样
#include<cstdio> int main() { printf("5*(5-(1/5))\n"); }
我的正解是枚举,加括号的方式有5种
(a b) (c d)
((a b) c) d
(a (b c)) d
a (b (c d))
a ((b c) d)
然后三个位置上的符号分别都进行枚举
#include<cstdio> #include<cmath> #define MIN 1e-10 double a, b, c, d; double cal(double n1, double n2, int op) { switch(op) { case 0: return n1+n2; case 1: return n1-n2; case 2: return n1*n2; case 3: return n1/n2; } } double mode(int m, int op1, int op2, int op3) { if(m == 0) { return cal(cal(a, b, op1), cal(c, d, op3), op2); } else if(m == 1) { return cal(cal(cal(a, b, op1), c, op2), d, op3); } else if(m == 2) { return cal(cal(a, cal(b, c, op2), op1), d, op3); } else if(m == 3) { return cal(a, cal(b, cal(c, d, op3), op2), op1); } else { return cal(a, cal(cal(b, c, op2), d, op3), op1); } } char ch(int op) { if(op == 0) { return '+'; } else if(op == 1) { return '-'; } else if(op == 2) { return '*'; } else { return '/'; } } void print(int cnt, int op1, int op2, int op3) { switch(cnt) { case 0: printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n", a, ch(op1), b, ch(op2), c, ch(op3), d); break; case 1: printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf\n", a, ch(op1), b, ch(op2), c, ch(op3), d); break; case 2: printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf\n", a, ch(op1), b, ch(op2), c, ch(op3), d); break; case 3: printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n", a, ch(op1), b, ch(op2), c, ch(op3), d); break; case 4: printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n", a, ch(op1), b, ch(op2), c, ch(op3), d); } } int main() { while(scanf("%lf%lf%lf%lf", &a, &b, &c, &d) != EOF) { bool notfind = true; int cnt, op1, op2, op3; for(cnt = 0; cnt < 5 && notfind; ++ cnt) { for(op1 = 0; op1 < 4 && notfind; ++ op1) { for(op2 = 0; op2 < 4 && notfind; ++ op2) { for(op3 = 0; op3 < 4 && notfind; ++ op3) { if(fabs(mode(cnt, op1, op2, op3) - 24) < MIN) { notfind = false; print(cnt, op1, op2, op3); } } } } } } return 0; }