递归之算24

来源:互联网 发布:权限管理的软件 编辑:程序博客网 时间:2024/06/05 10:21

描述:

给出4个小于10的正整数,你可以使用加减乘除以及括号把这四个数字连接起来得到一个表达式,现在的问题是,是否存在一种方式使得到的结果刚好为24, 这里加减乘除以及括号的运算结果以及优先级和我们平时的定义一样,(除法是实数除法)
例:5 5 5 1 5*(5-1/5)=24
1 1 4 2 无法得到24

代码实现

#include<iostream>#include<cmath>#define EPS 1e-6using namespace std;bool IsZero(double n){          return fabs(n) <= EPS;}bool Count24(double a[],int n){    if( n == 1)    {        if(IsZero(a[0] - 24))   return true;        else                    return false;    }    else    {        double b[5];        for(int i = 0;i < n-1; i++)        {            for(int j = i+1;j < n;j++)            {                int m = 0;                for(int k = 0;k < n;k++)                    if(k != i && k != j)                        b[m++] = a[k];                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;                }                if(!IsZero(a[i]))                {                b[m] = a[j] / a[i];                if(Count24(b,m+1))                    return true;                }               }        }    }    return false; }  int main() {    double a[5];    for(int i = 0;i < 4;i++)        cin >> a[i];    while(a[0] != 0)    {        if(Count24(a,4))    cout << "YES" << endl;        else                cout << "NO" << endl;        for(int i = 0;i < 4;i++)        cin >> a[i];     }      return 0; }
0 0