https://leetcode-cn.com/problems/24-game/solution/24-dian-you-xi-by-leetcode-solution/
#define tatget 24
const int ADD = 0, MULTIPLY = 1, SUBTRACT = 2, DIVIDE = 3;
const double EPSILON = 1e-6;
bool getresult(double* num, int len)
{
int i = 0, j = 0, m = 0, mm = 0;
double new[10] = { 0 };
if (len == 1)
{
return (fabs(*num - tatget) < EPSILON);
}
for(i=0;i<len;i++)
for (j = 0; j < len; j++)
{
if (i != j)
{
for (int k = 0; k < 4; k++)
{
if (k == ADD)
{
new[0] = num[i] + num[j];
m = 1;
mm = 0;
while ( mm < len)
{
if (mm != i && mm != j)
{
new[m] = num[mm];
m++;
}
mm++;
}
if(getresult(new, m))
return true;
}
else if (k == MULTIPLY)
{
new[0] = num[i] * num[j];
m = 1;
mm = 0;
while (mm++ != i && mm != j && mm < len)
{
new[m] = num[mm];
m++;
}
if (getresult(new, m))
return true;
}
else if (k == SUBTRACT)
{
new[0] = num[i] - num[j];
m = 1;
mm = 0;
while (mm++ != i && mm != j && mm < len)
{
new[m] = num[mm];
m++;
}
if (getresult(new, m ))
return true;
}
else if (k == DIVIDE)
{
if (num[j] == 0)
continue;
new[0] = num[i] / num[j];
m = 1;
mm = 0;
while (mm++ != i && mm != j && mm < len)
{
new[m] = num[mm];
m++;
}
if (getresult(new, m ))
return true;
}
}
}
}
return false;
}
bool judgePoint24(int* cards, int cardsSize)
{
double num[10] = { 0 };
for (int i = 0; i < cardsSize; i++)
num[i] = cards[i];
return getresult(num, cardsSize);
}
int main()
{
int a[] = { 1,2,1,2 };
bool m = judgePoint24(a,4);
return 0;
}
最后报错getresult()函数overflow。不懂为甚会这样
使用一个列表存储目前的全部数字,每次从列表中选出 2 个数字,再选择一种运算操作,用计算得到的结果取代选出的 2 个数字,这样列表中的数字就减少了 1 个。重复上述步骤,直到列表中只剩下 1 个数字,这个数字就是一种可能性的结果,如果结果等于 24,则说明可以通过运算得到 24。如果所有的可能性的结果都不等于 24,则说明无法通过运算得到 24。
调试了一下,崩溃的时候,new数组的第一个元素是-1#F,也就是个无效值,一般在除法中除数为0会出现这种情况。所以你检查一下代码中除法部分,在进行除法操作时,增加判断除数是否为0。