3.4 算24

3.4 算24

3.4 算24

3.4 算24

浮点数比较相等要用绝对值小于某个数(精度)来看。

3.4 算24

思路:要看4个数进行运算的结果是否为24,必须是先有两个数进行加减乘除运算,最后就只剩3个数了;然后再在3个数中选两个数进行加减乘除运算,最后加上运算结果就只有两个数了,这两个数再进行加减乘除运算,最后就只剩一个数了,就需要这样递归的来预算,看最终计算的最后一个数是否与24相等,如果相等就输出YES,不相等就输出NO。

这里需要注意的是,两个浮点数比较相等,不能直接用==,而需要用绝对值相减的结果要小于一个很小的数,这样才能说明两个数相等。

|a-b|<0.0000001,则说明a=b。

#include<iostream>
#include<cmath>
using namespace std;
double a[5];
#define EPS 1e-6

bool isZero(double x) 
{
	return fabs(x) <= EPS; //fabs(x)是求浮点数x绝对值的函数 
} 

bool count24(double a[],int n)//用数组a中的n个数计算24 
{
	if(n==1)//边界条件,当只剩一个数时 
	{
		if(isZero(a[0] - 24))
			return true;
		else
			return false;
	} 
	double b[5];//b[]存储变化中的值 
	for(int i = 0; i < n-1; ++i)
	{
		for(int j = i+1; j < n; ++j)//枚举两个数的所有组合 
		{
			int m = 0;//m表示剩余的数的个数 
			for(int k = 0; k < n; ++k)
			{
				if(k!= i && k != j)
					b[m++] = a[k];//将剩余的数存储在b[]中 
			}
			b[m] = a[i]+a[j];//将计算后的数存储在b[]中 
			if(count24(b,m+1))//m=n-1,将剩余的n-1个数继续递归 
				return true;
			b[m] = a[j] - a[i];
			if(count24(b,m+1))
				return true;
			b[m] = a[i] - a[j];
			if(count24(b,m+1))
				return true;
			b[m] = a[i]*a[j];
			if(count24(b,m+1))
				return true;
			if(!isZero(a[j]))
			{
				b[m] = a[i]/a[j];
				if(count24(b,m+1))
					return true;
			}
			if(!isZero(a[i]))
			{
				b[m] = a[j]/a[i];
				if(count24(b,m+1))
					return true;
			}
		}
	}
	return false;
}
int main()
{
	while(true)
	{
		for(int i = 0; i < 4; ++i)
			cin >> a[i];
		if(isZero(a[0]))
			break;
		if(count24(a,4))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
} 

3.4 算24

3.4 算24

3.4 算24

3.4 算24