用n个数计算24,第一步一定是先选取两个数进行某种运算,再将得到的结果和剩下的n-2个数构成n-1个数去算24。于是第一步操作后,问题变为和原问题形式相同但是规模减小(由n变为n-1)的新问题。这样的问题适合递归解决。
#include<iostream>
#include<cmath>
using namespace std;
#define eps 1e-6
//注意浮点数的比较
bool isZero(double x)
{
return fabs(x)<=eps;
}
//由数组a中的n个数来算24
bool count24(double a[], int n)
{
if(n==1) //只有一个数的话必须是24
{
if(isZero(a[0]-24)) return true;
else return false;
}
double b[5];
for(int i=0;i<n-1;i++) //先从数组a中选择两个数计算
{
for(int j=i+1;j<n;j++)
{
int k=0,h=0;
while(h<n)
{
if(h!=i && h!=j)
b[k++]=a[h];
h++;
}
b[k]=a[i]+a[j];
if(count24(b,n-1))
return true;
b[k]=a[i]-a[j];
if(count24(b,n-1))
return true;
b[k]=a[j]-a[i];
if(count24(b,n-1))
return true;
b[k]=a[i]*a[j];
if(count24(b,n-1))
return true;
//注意分母不为0啊
if(!isZero(a[j]))
{
b[k]=a[i]/a[j];
if(count24(b,n-1))
return true;
}
if(!isZero(a[i]))
{
b[k]=a[j]/a[i];
if(count24(b,n-1))
return true;
}
}
}
return false;
}
int main()
{
double a[5];
while(true)
{
double sum=0;
for(int i=0;i<4;i++)
{
cin>>a[i];
sum+=a[i];
}
if(isZero(sum)) break;
if(count24(a,4))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}