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()函数模拟出括号的排列顺序

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值