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种情况:(去掉重复)
- ((A<>B)<>C)<>D
- (A<>(B<>C))<>D
- A<>(B<>(C<>D))
- A<>((B<>C)<>D)
- ((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()函数模拟出括号的排列顺序