计算24点

//---------------------------------------------------------------------------
//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;
  }
 }
}
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值