int can24(double * data, int count, double shouldVal)
{
#define fabs(x) ((x) < 0 ? ((x)*(-1)) : (x))
/*判断4个数按照两个两个分组,分别计算出两个值,然后再根据两个值计算一下看看能不能构成shouldVal,
这个x表示其中两个构成的一对计算出的值,然后pairshould判断另外两对计算的值能否跟之前计算的x算得shouldVal,比如四个数4,4,1,2 我让4,4一对,计算出一个x=8(当然,可以计算出其他值比如4/4=1),然后我的shouldVal是24,pairShould(8)就是判断另外两个1,2能否算得一个数,这个数跟8能够算得shouldVal
*/
#define pairShould(x) ( \
fabs(x) > 0.00001 && can24(data + 2, 2, shouldVal/(x)) \
|| fabs(x) > 0.00001 &&can24(data + 2, 2, (x)/shouldVal) \
|| can24(data + 2, 2, (x) - shouldVal) \
|| can24(data + 2, 2, shouldVal - (x)) \
|| can24(data + 2, 2, shouldVal + (x)) \
|| fabs(x) > 0.00001 && can24(data + 2, 2, (x) * shouldVal) \
)
//交换两个double类型的浮点数
#define fswap(x,y) {double tmp = x; x = y; y = tmp;}
if(count == 1) return data[0] == shouldVal;
if(count == 2)
{
if(fabs(data[0]/data[1] - shouldVal) < 0.00001 || fabs(data[1]/data[0] - shouldVal) < 0.00001 ||
fabs(data[0] - data[1] - shouldVal) < 0.00001 || fabs(data[1] - data[0] - shouldVal) < 0.00001 ||
fabs(data[0] + data[1] - shouldVal) < 0.00001
) return 1;
else return 0;
}else if(count == 4){
for(int i = 0; i < 4; i++)//计算两两一对能否计算出24
{
fswap(data[0], data[i]);
if(pairShould(data[0] + data[1])) return 1;
if(pairShould(data[0] * data[1])) return 1;
if(pairShould(data[0] / data[1])) return 1;
if(pairShould(data[1] / data[0])) return 1;
if(pairShould(data[0] - data[1])) return 1;
if(pairShould(data[1] - data[0])) return 1;
fswap(data[0], data[i]);
}
}
for(int i = 0; i < count; i++)//判断,先计算其中三个数的求值,然后结果跟剩余的那个数求值,就是1+3模式,看看能否计算出24
{
fswap(data[0], data[i]);
if(can24(data + 1, count - 1, data[0]/shouldVal)) return 1;
if(can24(data + 1, count - 1, data[0] * shouldVal)) return 1;
if(can24(data + 1, count -1, shouldVal/data[0])) return 1;
if(can24(data + 1, count -1, shouldVal + data[0])) return 1;
if(can24(data + 1, count - 1, data[0] - shouldVal)) return 1;
if(can24(data + 1, count -1, shouldVal - data[0])) return 1;
fswap(data[0], data[i]);
}
return 0;
}