//---------------------------------------------------------------------------
//24点的C++算法
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
//计算24点
void __stdcall Compute24(int len);
//EXP[0]-EXP[1]无用,EXP[2]-EXP[4]记录操作符
int EXP[5];
//OPT[0]-OPT[1]无用,OPT[][0]-EXP[][3]分别对应操作数a,操作数b,结果t
float OPT[5][3];
//四个数字
//float NUM[4]={5,5,5,1};//有解
float NUM[4]={2,3,5,6};//有解
//float NUM[4]={3,4,6,7};//无解
//最终结果
const float result=24.0;
//解的个数
int count=0;
//测试
void test(void)
{ //产生随机数,1-9,不重复
srand(GetTickCount());
for(int i=0;i<4;++i)
{ int j,t;
do
{ t=1+rand()%9;
for(j=0;j<i;++j)
if(t==NUM[j])
break;
}while(j<i);
NUM[i]=(float)t;
}
printf("/t%3.3f,%3.3f,%3.3f,%3.3f/n",NUM[0],NUM[1],NUM[2],NUM[3]);
Compute24(4);
if(count==0)
{ printf("/t对不起,本次无解!/n");
}
// system("pause");
}
//计算24点
void __stdcall Compute24(int len)
{ //终止条件
if(len==1)
{ if(fabs(NUM[0]-result)<0.001)
{ printf("第%d种:/n",++count);
for(int i=4;i>1;--i)
{ printf("/t%3.3f/t%3c/t%3.3f/t=/t%3.3f/n",/
OPT[i][0],EXP[i],OPT[i][1],OPT[i][2]);
}
}
return;
}
//任取两数
for(int i=0;i<len;++i)
{ for(int j=i+1;j<len;++j)
{ float a=NUM[i];
float b=NUM[j];
float t;
NUM[j]=NUM[len-1];//调整数组
//六种可能,分别执行
OPT[len][0]=a,OPT[len][1]=b;
NUM[i]=t=a+b;//加法
EXP[len]='+',OPT[len][2]=t;
Compute24(len-1);
NUM[i]=t=a-b;//减法
EXP[len]='-',OPT[len][2]=t;
Compute24(len-1);
NUM[i]=t=a*b;//乘法
EXP[len]='*',OPT[len][2]=t;
Compute24(len-1);
if(fabs(b)>0.001)
{ NUM[i]=t=a/b;//除法
EXP[len]='/';
OPT[len][2]=t;
Compute24(len-1);
}
OPT[len][0]=b,OPT[len][1]=a;
NUM[i]=t=b-a;//交换减法
EXP[len]='-',OPT[len][2]=t;
Compute24(len-1);
if(fabs(a)>0.001)
{ NUM[i]=t=b/a;//交换除法
EXP[len]='/';
OPT[len][2]=t;
Compute24(len-1);
}
//恢复数组
NUM[i]=a;
NUM[j]=b;
}
}
}
*/