Openjudge-2787-算24
阿新 • • 發佈:2018-12-08
這題的話,我們思考一下,我們首先選兩個數進行計算,然後得到三個數,然後再進行計算,然後再選兩個數再進行計算,然後剩下兩個數,然後再進行計算,就剩下一個數了, 這時候我們就判斷它是否等於二十四。
判斷的方法是浮點數的精度進行比較,我們設一個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; }