C语言24点问题

C语言24点问题

在屏幕上输入1〜10范围内的4个整数(可以有重复),对它们进行加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式。
例如输入4个整数4、5、6、7,可得到表达式:4*((5-6)+7)=24。这只是一个解,要求输出全部的解。要求表达式中数字的顺序不能改变。

解题思路:穷举法

分析:
1.假设输入A,B,C,D四个未知数,在不考虑括号优先级的情况下,即用四则运算符将它们连接起来,即A<>B<>C<>D,共有3^4的组合(+,-,*,/)。
2.当考虑括号优先级时,有以下5种情况:(去掉重复)

  1. ((A<>B)<>C)<>D
  2. (A<>(B<>C))<>D
  3. A<>(B<>(C<>D))
  4. A<>((B<>C)<>D)
  5. ((A<>B)<>(C<>D)

得到代码:

void mycode_11()
{srand((unsigned)time(NULL));double A, B, C, D;A = (rand() % 12) + 1;B = (rand() % 12) + 1;C = (rand() % 12) + 1;D = (rand() % 12) + 1;//A = 1, B = 2, C = 3, D = 4;printf("A:%.1f,B:%.1f,C:%.1f,D:%.1f\n\n", A, B, C, D);int op1, op2, op3;char op[4] = { '+', '-', '*', '/' };for (op1 = 0; op1 < 4; op1++)for (op2 = 0; op2 < 4; op2++)for (op3 = 0; op3 < 4; op3++){if (cal_1(A, B, C, D, op1, op2, op3) == 24)printf("((%.1f %c %.1f) %c %.1f) %c %.1f = 24\n", A, op[op1], B, op[op2], C, op[op3], D);if (cal_2(A, B, C, D, op1, op2, op3) == 24)printf("(%.1f %c (%.1f %c %.1f)) %c %.1f = 24\n", A, op[op1], B, op[op2], C, op[op3], D);if (cal_3(A, B, C, D, op1, op2, op3) == 24)printf("%.1f %c (%.1f %c (%.1f %c %.1f)) = 24\n", A, op[op1], B, op[op2], C, op[op3], D);if (cal_4(A, B, C, D, op1, op2, op3) == 24)printf("%.1f %c ((%.1f %c %.1f) %c %.1f) = 24\n", A, op[op1], B, op[op2], C, op[op3], D);if (cal_5(A, B, C, D, op1, op2, op3) == 24)printf("(%.1f %c %.1f) %c (%.1f %c %.1f) = 24\n", A, op[op1], B, op[op2], C, op[op3], D);}printf("运行结束!");
}double cal(double a, double b, int op)
{switch (op){case 0:return a + b;case 1:return a - b;case 2:return a * b;case 3:return a / b;default:return 0.0;}
}double cal_1(double A, double B, double C, double D, int op1,int op2,int op3)
{double s1 = cal(A, B, op1);double s2 = cal(s1, C, op2);double s3 = cal(s2, D, op3);return s3;
}double cal_2(double A, double B, double C, double D, int op1, int op2, int op3)
{double s1 = cal(B, C, op1);double s2 = cal(A, s1, op2);double s3 = cal(s2, D, op3);return s3;
}double cal_3(double A, double B, double C, double D, int op1, int op2, int op3)
{double s1 = cal(C, D, op3);double s2 = cal(B, s1, op2);double s3 = cal(A, s2, op1);return s3;
}double cal_4(double A, double B, double C, double D, int op1, int op2, int op3)
{double s1 = cal(B, C, op2);double s2 = cal(s1, D, op3);double s3 = cal(A, s2, op1);return s3;
}double cal_5(double A, double B, double C, double D, int op1, int op2, int op3)
{double s1 = cal(A, B, op1);double s2 = cal(C, D, op3);double s3 = cal(s1, s2, op2);return s3;
}

问题解决!

关键解题思路:
cal()函数是核心,cal_1()至cal_5()函数通过cal()函数模拟出括号的排列顺序


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部