题目:
思路:N个数算24,必有两个数要先算。这两个数算的结果和剩余n-2个数就构成了n-1个数求24的问题。
枚举先算的两个数,以及这两个数的运算方式(+-*/)
边界条件:一个数等于24
注意:浮点数比较相等,不能用==,而是看两浮点数差值的绝对值是否小于某个数
#include <iostream>
#include<cmath>
using namespace std;
double a[5];//输入5个数
#define EPS 1e-6 //定义EPS 10的负六次方
bool isZero(double x)//看差值的绝对值是不是小于EPS这个数
{
return fabs(x) <= EPS;
}
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];//建立新数组,把剩余数放里面
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)//枚举两个数的组合
{
int m = 0;//还剩m个数,m=n-2
for (int k = 0; k < n; k++)
{
if (k != i && k != j)
b[m++] = a[k];//把剩余数放入b
}
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;
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;
}
}
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;
}
样例:
参考北大网课