这个代码来自郭炜老师的PPT
我把它写下来的时候试了好几遍都是错的
反复看了几遍才发现括号的位置错了
都是一些小错误,但总会让程序不对qwq
也是经常犯的毛病了,,往后写代码的时候还得多加细心,以此告诫自己
题目给了一个四个数据的数组,求能否算出24(其实就是24点啦hhhh)
然后注意的是浮点类型的比较不能用==,所以要用两者相减并与一个很小(趋近于0)的数相比的形式
//北大郭炜 程序设计与算法(二)递归(二)例四 算24
//2020/2/6 0:42
#include<bits/stdc++.h>
using namespace std;
double a[5];
#define EPS 1e-6
bool isZero(double x){//判断浮点数x是否为0
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;
for(int k=0;k<n;k++)//还剩m个数,m=n-2
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])){//注意div0不可以
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(){
for(int i=0;i<4;i++){
cin>>a[i];
}
if(count24(a,4))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
多吸取教训,少犯类似错误