首先采取问题分解的思路, 第一步用两个数进行运算, n个数算24点, 必有两个数要先进行运算, 这两个数运算的结果, 和剩余(n-2)个数, 即构成(n-1)个数求24点的问题. 一个数算24, 它的边界条件直接报出yes or no, 注意用到除法可能会变成小数即浮点数, 浮点数比较是否相等不能用==. n个数每次递减, 直至减为0.
#include#include using namespace std; double a[5];//计算24一般都是4个数进行加减乘除运算, 所以这里用5存放 #define EPS le-6//定义一个很小的数10的-6次方 bool isZero(double x) {//isZero函数判断浮点数x是否等于0 return fabs(x) <= EPS; } bool count24(double a[],int n) {//关键函数, 用数组a里面的n个元素去算24, 如果成功,返回值为true;不成功,返回值为false //用数组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) {//选出两个数, 算24, 用两重循环选出不同两个数的不同组合 //枚举两个数的组合 int m = 0;//还剩下m个数, m = n - 2 for(int k = 0; k < n ; ++k)//遍历n个数 if(k != i && k != j )//说明a[k]是否选出的数 b[m++] = a[k];//把其余数放入b b[m] = a[i] + a[j];//加法, 放入b数组 if(count24(b, m+1))//用b里面存放的m+1个数去算24看能否true, 这里其实是m+1等于n+1的 return true; b[m] = a[i] - a[j];//减法, 放入b数组 if(count24(b, m+1)) return true; b[m] = a[j] - a[i];//反过来再减法, 放入b数组 if(count24(b, m+1)) return true; b[m] = a[i] * a[j];//乘法, 放入b数组 if(count24(b, m+1)) return true; if( !isZero(a[j]))//a[j]不为0 { b[m] = a[i] / a[j];//除法, 放入b数组 if(count24(b, m+1)) return true; } if( !isZero(a[i]))//a[i]不为0 { b[m] = a[j] / a[i];//反过来再除法, 放入b数组 if(count24(b, m+1)) return true; } } return false;//算不出24即false掉 }
计算机201txl



