浮点数比较相等要用绝对值小于某个数(精度)来看。
思路:要看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;
}