算24

03 算24
描述

给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。

这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。

比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。

输入

输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。

输出

对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。

样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO
分析

​ 题目的意思,随便使用括号,意思就是运算顺序随便我们如何组合。

​ 这个本质上还是需要使用递归遍历+分解的做法。从4个数中选取两个数进行某种运算,然后把得到的数与剩下的两个数组合成一个3个数的数组,在这个数组中算24,最后分解为对1个数组算24的情况。

​ 这里还发现了一个好玩的情况,如果我们的bool函数最后不return false,它就会自动结束,然后返回true。

代码实现
#include<iostream>
#include<cmath>
#define efs 1e-6
using namespace std;

bool f(double n);
bool count24(double a[], int n);

int main()
{
	double arr[5] = { 0 };
	while (cin >> arr[0] >> arr[1] >> arr[2] >> arr[3] && arr[0] + arr[1] + arr[2] + arr[3] > 0)
	{
		if (count24(arr, 4))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
}

bool f(double n)
{
	if (fabs(n) < efs)
		return true;
	else return false;
}

bool count24(double a[], int n)
{
	if (n == 1)
	{
		if (f(a[0] - 24))
			return true;
		return false;
	}
	double b[5] = { 0 };
    //选择任意不同的两个数进行运算
	for (int i = 0; i < n ; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			if (i == j)continue;
			int m = 0;
			for (int k = 0; k < n; ++k)
			{//把其余的数放到数组里
				if (k != i && k != j)
					b[m++] = a[k];
			}
            //把运算后的数放到数组立
			b[m] = a[i] + a[j];
			if (count24(b, n - 1))//对运算后的n-1个数进行算24操作
				return true;
			b[m] = a[i] - a[j];
			if (count24(b, n - 1))
				return true;
			b[m] = a[i] * a[j];
			if (count24(b, n - 1))
				return true;
			if (a[j] != 0)b[m] = a[i] / a[j];
			if (count24(b, n - 1))
				return true;
		}
	}
	return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值