1. 程式人生 > >Openjudge-2787-算24

Openjudge-2787-算24

這題的話,我們思考一下,我們首先選兩個數進行計算,然後得到三個數,然後再進行計算,然後再選兩個數再進行計算,然後剩下兩個數,然後再進行計算,就剩下一個數了, 這時候我們就判斷它是否等於二十四。

判斷的方法是浮點數的精度進行比較,我們設一個10的-6次方精度,如果某浮點數與24的差的絕對值小於這個精度,我們就判定它們相等。

計算的方法有6種,加減乘除,減和除法,分別有兩種,除法進行的時候,我們首先判斷一下除數是否等於零,避免出現計算錯誤。

少算一種方法是不能過的。

#include <iostream>
#include <cmath>
using namespace std;
const double EPS=1e-6;

bool isZero(double x)
{
    return fabs(x)<=EPS;
}

bool Count24(double a[],int n)
{
    if (n==1) {
        if (isZero(a[0]-24))
            return true;
        else 
            return false;
    }
    for (int i=0;i<n-1;i++) {
    	double b[5];
        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[i])) {
                b[m]=a[j]/a[i];
                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()
{
    double b[5];
    while (cin>>b[0]>>b[1]>>b[2]>>b[3]&&b[0]&&b[1]&&b[2]&&b[3]) {
        if (Count24(b,4))
            cout<<"YES"<<endl;
        else 
            cout<<"NO"<<endl; 
    }
    return 0;
}