思路
1、先从4个数里面选出2个数,这时候就需要枚举出选这2个数的所有可能,通过for循环。通过数学思维,我们可以通过两个变量i,j镶嵌的for循环列出所有可能。
2、列举4个数之后就剩下n-2个数,再加上那两个数之间得到的数,加起来就是n-1个数的计算。那么这样子就存在递归的思想了。
3、那么这时候应该建立一个新的数组b来存放那n-2个数,在选出的两个数分别通过+-*/存放进新的数组b里面并进行递归判断是否符合24.
边界条件
一个数的值等于24
注意:浮点数比较是否相等,不能用==。而应该用那个数和24的差的绝对值是不是小于一个很小的数
#include <iostream>
#include <cmath>
using namespace std;
const double k=1e-8;
bool iszero(double x)
{
return fabs(x)<=k;
}
bool count24(double a[],int n)
{
if(n==1)//边界条件
return iszero(a[0]-24);
//枚举两个数
double b[5];
int i,j,k;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
//枚举之后存放另外n-2个数,先创建一个数组b
int m=0;
for(k=0;k<n;k++)
if(k!=i&&k!=j)
b[m++]=a[k];
//把挑选得两个数得到的值也放数组b里面去
b[m]=a[i]+a[j];//这个m要从上面的m++递增理解
if(count24(b,m+1))//m+1相当于n-1.因为数组是从0算起的
return true;
b[m]=a[i]-a[j];
if(count24(b,m+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;
b[m]=a[j]/a[i];
if(count24(b,m+1))
return true;
}
return false;
}
int main()
{
double a[5];
int i=0;
while(cin>>a[i])
{
i++;
if(i==4)
{
i=i%4;
if(count24(a,4))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}