CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

高手给出算24的算法

楼主vecen(Eye*神)2006-03-03 11:50:36 在 C/C++ / C语言 提问

相信算24的游戏大家玩过吧!~请高手给出一个算24的算法,输入四个数,他们经过计算得24,最后的结果是给出所有可能的计算的公式!  
  例如:2,3,4,6           4*6*(3-2)=24  
  1,4,5,7     4*7-5+1=24 问题点数:20、回复次数:49Top

1 楼ouyh12345(五岭散人)回复于 2006-03-03 12:01:26 得分 0

列出四个数的所有排列  
  在排列中插括号和运算符  
  表达式求值Top

2 楼myhouwei(myhouwei)回复于 2006-03-03 13:06:10 得分 0

我也想了很旧,而且有无解的情况,如1,1,1,1Top

3 楼vecen(Eye*神)回复于 2006-03-03 13:32:50 得分 0

to:二楼的  
  我开始就想到那个方法,太麻烦了!  
  我想采用一种递归的方法,但一直没有思路!~  
  肯请大侠指教Top

4 楼wumingchenchao(一缕阳光)回复于 2006-03-03 13:34:56 得分 0

关注。markTop

5 楼fancn21th(猴猴)回复于 2006-03-03 14:23:43 得分 0

首先我是菜鸟,曾经想过这个题目结果思路和网络上的一些算法差不多  
  穷举  
  4个数字的组合是p44=4*3*2*1  
  运算符的组合是4*4*4  
  括号的.....  
  嘿嘿,然后自己想吧Top

6 楼cuibo1123(月满C楼)回复于 2006-03-03 14:34:44 得分 0

挺挑战~~~  
   
  想个算法:  
   
         24  
         /\  
           x   &     y  
                          /\         /\  
                      x1&y1     x2&y2  
   
  就是想办法来拆分24  已接近你输入的值  
  具体描述挺复杂~~    
   
  实现也不容易~~  
   
  呵呵Top

7 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 14:36:33 得分 0

上学的时候写过,  
  在家里,回去贴~~Top

8 楼yjshm(自由与成长)回复于 2006-03-03 15:45:19 得分 0

呵,用穷举法,吧。一般都   是这样做的。Top

9 楼lbing7(向青润老大学习!!!)回复于 2006-03-03 15:55:04 得分 0

我想的可能更笨:  
  用递归生成表达式串  
  再算表达式的值  
   
  Top

10 楼zzw820626(偶要分,偶要星星)回复于 2006-03-03 17:07:33 得分 0

从   4个树中任取   2个数    
  操作可以分成两类:  
  1,一类增加型:*   ,+  
  2,另一类减少型:/,-  
  关于括号:任何一个表达式都可以转化为逆波兰表达式,所以说都可以去掉括号。  
  那么我们可以依据你波兰结算的方法:  
  1。先从4个数中任取两个,从四个操作符中任一个     总共   4*3*4   种可能       计算出结果result1  
  2。从深下的2个数中去一个,从剩下的3个操作符中取1个人   总共   2*3   中可能   计算结果   result2  
  3.还剩一次计算机会,从剩下的2个操作符中取一个   总共2种可能,如果result2>24选减少型操作,如果result224选增加型操作。   result2==24   无结果。实际可能性为1  
   
  总共的可能性为:     4*3*4*2*3*1=288    
   
  没有考虑1的特殊情况。不知道是否可行。  
  Top

11 楼qybao(阿宝)回复于 2006-03-03 17:12:42 得分 0

我也想了很旧,而且有无解的情况,如1,1,1,1  
  -------------------------------  
  (1+1+1+1)!   //阶乘就可以Top

12 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 17:32:08 得分 0

注意,每个操作符只能使用一次啊!!Top

13 楼hldc(胡乱打造)回复于 2006-03-03 19:04:50 得分 0

网上的方法都是穷举法,没有其它的方法了。Top

14 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 19:15:59 得分 0

用排列组合实现的,限制了每个运算符只使用一次,找到一个结果就退出:  
   
  /*  
  // g24.cpp   --   Try   to   get   24   use   4   number   and   basic   operator.  
  // By   adie   ,2005-01-15 http://www.adintr.com  
  // Report   bug   to   <webmaster@adintr.com>  
  */  
   
  #include   <iostream>  
  #include   <string>  
  #include   <cstdio> //   need   sprintf()   and   sscanf()  
  #include   <conio.h> //   need   getch()  
  #include   <algorithm> //   need   min()   and   count()  
  #include   <boost/timer.hpp> //   测试用时  
   
  int   times=0; //   记录失败的次数  
   
  class   Combin //   组合类,可得到所有可能的组合  
  {  
  public:  
          Combin(int   count,int   select=1) //     从   count   个数中选取   select   个数  
          {  
                  if(select>count)  
                          throw   std::string("Select   Must   Less   Than   Count");  
                           
                  m_data=new   int[count];  
                  m_point=new   int[select];  
                  m_descr=new   std::string[count];  
                   
                  for(int   i=0;i<select;++i)  
                          m_point[i]=i;  
                  m_count=count;  
                  m_select=select;  
          }  
          ~Combin(){   delete   []   m_data;   delete   []   m_descr;   delete   []   m_point;   }  
           
          bool   Setdata(int   index,int   data,std::string   desc="") //   设置待组合的数据  
          {  
                  if(index>=m_count)  
                          return   false;  
                   
                  m_data[index]=data;  
                  if(desc=="")  
                  {  
                          char   tmb[16];  
                          sprintf(tmb,"%d",data);  
                          desc=std::string(tmb);  
                  }  
                  m_descr[index]=desc;  
                  return   true;  
          }  
   
          int   Getdata(int   i) //   返回组合后的第   i   个数据  
          {  
                  if(i>=m_select)  
                          throw   std::string("Bad   index   of   data!");  
                           
                  return   m_data[m_point[i]];  
          }  
           
          std::string   Getdesc(int   i) //   返回组合后第   i   个数据的描述  
          {  
                  if(i>=m_select)  
                          throw   std::string("Bad   index   of   desc!");  
                  return   m_descr[m_point[i]];  
          }  
           
          int   Getleftdata(int   i) //   返回组合后第   i   个剩余的数据  
          {  
                  return   m_data[getleftid(i)];  
          }  
           
          std::string   Getleftdesc(int   i) //   返回组合后第   i   个剩余数据的描述  
          {  
                  return   m_descr[getleftid(i)];  
          }  
           
           
          bool   Select() //   进行下一次组合,组合失败返回   false  
          {  
          for(int   i=m_select-1;i>=0;--i)  
          {  
                  if(m_point[i]<m_count-m_select+i)  
                  {  
                          m_point[i]++;  
                          for(int   j=i+1;j<m_select;++j)  
                                  m_point[j]=m_point[j-1]+1;  
                          return   true;  
                  }  
          }  
          return   false;  
  }  
   
          void   Reset() //   重置组合为初始状态  
          {  
                  for(int   i=0;i<m_select;++i)  
                          m_point[i]=i;  
          }  
           
          int   Getcount()   {   return   m_count;   }  
          int   Getselect()   {   return   m_select;   }  
           
          void   Swapsel(int   r1,int   r2) //   交换两个组合中的数据,这个操作本不应该放在这个类中的,为了使用方便放弃的设计上的合理!勿笑!  
          {  
                  if(r1>=m_select||r2>=m_select)  
                          throw   std::string("Bad   index   of   swap!");  
                  int   t_int=m_data[m_point[r1]];  
                  std::string   t_str=m_descr[m_point[r1]];  
                  m_data[m_point[r1]]=m_data[m_point[r2]];  
                  m_descr[m_point[r1]]=m_descr[m_point[r2]];  
                  m_data[m_point[r2]]=t_int;  
                  m_descr[m_point[r2]]=t_str;  
          }  
                   
  private:  
          int   m_count,m_select;  
          int   *   m_data;  
          int   *   m_point;  
          std::string   *   m_descr;  
           
          int   getleftid(int   i)  
          {  
                  if(i>=m_count-m_select)  
                          throw   std::string("Bad   index   of   left   data!");  
                  int   ind=-1;  
                  ++i;  
                  do  
                  {  
                          --i;  
                          ++ind;  
                          for(int   j=0;j<m_select;++j)  
                                  if(m_point[j]==ind)  
                                  {  
                                          ++ind;  
                                          j=0;  
                                  }  
                  }   while(i>0);  
                  return   ind;  
          }  
  };  
  Top

15 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 19:16:56 得分 0

 
  bool   Test24(Combin   *   num,Combin   *   oper); //   使用指定数据和操作符的组合能否得到   24  
   
  int   main(int   argc,char   *argv[])  
  try  
  {  
  int   input[4];  
  if(argc>=5)  
  for(int   i=1;i<5;++i)  
  sscanf(argv[i],"%d",&input[i-1]);  
  else  
  {  
        std::cout<<"Input   the   data:";  
        std::cin>>input[0]>>input[1]>>input[2]>>input[3];  
  }  
           
          boost::timer   mytime; //   开始计时!!  
           
          Combin   number(4,2);  
          Combin   operat(4,1);  
          number.Setdata(0,input[0]);  
          number.Setdata(1,input[1]);  
          number.Setdata(2,input[2]);  
          number.Setdata(3,input[3]);  
           
          operat.Setdata(0,'+',"+   ");  
          operat.Setdata(1,'-',"-   ");  
          operat.Setdata(2,'*',"×");  
          operat.Setdata(3,'/',"÷");  
           
          if(!Test24(&number,&operat))  
                  std::cout<<"inextricability!   trid   "<<times<<"   times."<<std::endl;  
           
          std::cout<<"It   takes   "<<mytime.elapsed()<<"   seconds   for   the   task."; //   结束计时并显示  
           
          if(argc<=1) //   如果不是从命令行输入,按键后再结束  
          getch();  
  }  
  catch(std::string   e)  
  {  
          std::cout<<e<<std::endl;  
          getch();  
          exit(0);  
  }  
  catch(...)  
  {  
          std::cout<<"Unknown   Except!"<<std::endl;  
          getch();  
          exit(0);  
  }  
   
   
   
  bool   getresult(char   oper,int   n1,int   n2,int   *   result) //   返回两个数的运算结果,不能整除返回   false  
  {  
          switch(oper)  
          {  
                  case   '+':  
                          *result=n1+n2;  
                          return   true;  
                  case   '-':  
                          *result=n1-n2;  
                          return   true;  
                  case   '*':  
                          *result=n1*n2;  
                          return   true;  
                  case   '/':  
                          if(n2==0)  
                                  return   false;  
                          if(n1%n2!=0)  
                                  return   false;  
                          else  
                          {   *result=n1/n2;  
                                  return   true;  
                          }  
                          break;  
                  default:  
                          return   false;  
          }  
  }  
   
  bool   Gonext(Combin   *   num,Combin   *   oper,int   result) //   进入更深一次测试  
  {  
          Combin   snum(num->Getcount()-1,min(2,num->Getcount()-1));  
          Combin   soper(oper->Getcount()-1,1);  
          char   buff[512];  
          if(oper->Getdata(0)=='+'||oper->Getdata(0)=='-')  
          {  
                  std::string   s1=num->Getdesc(0),s2=num->Getdesc(1);  
                  if(s1[0]=='('&&s1[s1.size()-1]==')')  
                          s1=s1.substr(1,s1.size()-2);  
                  if(oper->Getdata(0)=='+'&&s2[0]=='('&&s2[s2.size()-1]==')')  
                          s2=s2.substr(1,s2.size()-2);  
                  char   *   format="(%s%s%s)";  
                  if(num->Getcount()==2)  
                          format="%s%s%s";  
                  sprintf(buff,format,s1.c_str(),oper->Getdesc(0).c_str(),s2.c_str());  
          }  
          else  
                  sprintf(buff,"%s%s%s",num->Getdesc(0).c_str(),oper->Getdesc(0).c_str(),  
                  num->Getdesc(1).c_str());  
           
          int   i;  
          snum.Setdata(0,result,buff);  
          for(i=0;i<num->Getcount()-num->Getselect();++i)  
                  snum.Setdata(i+1,num->Getleftdata(i),num->Getleftdesc(i));  
           
          for(i=0;i<oper->Getcount()-oper->Getselect();++i)  
                  soper.Setdata(i,oper->Getleftdata(i),oper->Getleftdesc(i));  
           
          if(Test24(&snum,&soper))  
                  return   true;  
          return   false;  
  }  
   
  bool   Test24(Combin   *   num,Combin   *   oper)  
  {  
          int   result;  
           
          do   {  
                  do   {  
                           
                          if(num->Getcount()==1)  
                          {  
                                  if(num->Getdata(0)==24)  
                                  {  
                                          int   c_kh=std::count(&num->Getdesc(0).c_str()[0],&num->Getdesc(0).c_str()[0]+num->Getdesc(0).size(),'(');  
                                          if(c_kh>1)  
                                                  ++times;  
                                          else  
                                          {  
                                                  std::cout<<num->Getdesc(0)<<"=   24"<<std::endl;  
                                                  return   true;  
                                          }       }  
                                  else  
                                          ++times;  
                          }  
                          else  
                          {  
                                  if(getresult(oper->Getdata(0),num->Getdata(0),num->Getdata(1),&result))  
                                          if(Gonext(num,oper,result))  
                                                  return   true;  
                                  if(oper->Getdata(0)=='-'||oper->Getdata(0)=='/')  
                                          if(getresult(oper->Getdata(0),num->Getdata(1),num->Getdata(0),&result))  
                                          {  
                                                  num->Swapsel(0,1);  
                                                  if(Gonext(num,oper,result))  
                                                          return   true;  
                                                  num->Swapsel(0,1);  
                                          }  
                                   
                          }  
                           
                           
                  }   while(oper->Select());  
                  oper->Reset();  
          }   while(num->Select());  
          return   false;  
  }  
   
  Top

16 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 19:20:56 得分 0

E:\My   Work\ISOC++\g24>g24   1   2   3   4  
  inextricability!   trid   628   times.  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   6   6   6   6  
  6×6-   (6+   6)=   24  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   100   20   30   40  
  inextricability!   trid   456   times.  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   23   43   19   32  
  inextricability!   trid   232   times.  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   2   3   4   6  
  4÷(3-   2)×6=   24  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   9   8   5   7  
  (5-   9+   7)×8=   24  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   1000   200   30   10  
  inextricability!   trid   508   times.  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   17   19   21   3  
  inextricability!   trid   300   times.  
  It   takes   0   seconds   for   the   task.  
  E:\My   Work\ISOC++\g24>g24   5   9   12   7  
  (5+   9)×12÷7=   24  
  It   takes   0   seconds   for   the   task.Top

17 楼fcc_ecjtu(成)回复于 2006-03-03 19:49:13 得分 0

MarkTop

18 楼bombwang(王)回复于 2006-03-03 20:00:05 得分 0

mark  
  Top

19 楼ttlyfast()回复于 2006-03-03 20:16:42 得分 0

算法复杂程度相当与系统实现Top

20 楼ttlyfast()回复于 2006-03-03 20:18:08 得分 0

收藏Top

21 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 20:56:48 得分 0

时间隔得比较久了,只记得当初想法挺简单的,不知道怎么会写这么长。。。  
  首先从   4   个数中选择两个(C4:2),从四个操作符中选择一个进行运算(C4:1)得到一个结果(如果是减法或除法的话分两种情况计算),把这个结果合剩下的两个数放在一起,然后从这个三个数中选择两个(C3:2),从剩下的三个操作符中选择一个来运算,得到一个结果,继续和剩下的放在一起来进行组合,直到只剩下两个数为止。  
   
  中间如果遇到除不尽得情况则放弃这一次组合,继续下一组。  
  因为如果出现除不尽的话只有在之后用乘法才可能得到一个整数结果,而这种情况都可以在另一个先使用乘法的组合下找到,比如   x   /   y   *   z   中   x   /   y   得到一个小数,*   z   后有变为整数,完全可以在另一种组合   x   *   z   /   y   中使中间过程不出现小数。  
  所以中间丢掉除不尽的情况不会丢掉可能的组合,而可以减少许多不必要的探测,提高速度Top

22 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-03 21:05:07 得分 0

中间为了跟踪每一种组合的组合过程,以便于输出增加了不少的复杂度,  
  现在看着也不知道怎么会写这么长啊。。。Top

23 楼51365133(渊海)回复于 2006-03-03 21:09:17 得分 0

#include   <stdio.h>  
  #include   <stdlib.h>  
  #include   <string.h>  
  class   data  
  {  
  private:  
  int   m_num;  
  int   m_bas;  
  public:  
          int   add;  
  int   dec;  
  int   mul;  
  int   div;  
  data(int   num,int   bas)//初始化数   和   基数  
  {  
  m_num=num;  
  m_bas=bas;  
  }  
  void   init()//分解数  
  {  
  add=m_num+m_bas;//和  
  dec=m_bas-m_num;//差  
  mul=m_num*m_bas;//乘  
  if(m_num!=0)//除  
  div=m_bas/m_num;  
  else  
  div=0;  
  }  
  void   putn(int   *databuf)//讲分解的结果写到一个连续的存储空间  
  {  
  *databuf++=add;  
  if(dec>=0)  
  *databuf++=dec;  
  *databuf++=mul;  
  if((div*m_num)==m_bas)  
  *databuf++=div;  
  *databuf='\0';  
  }  
  };  
   
  void   oder(int   *num);  
  int   main()  
  {  
  int   base[4]={2,4,6,20};  
  //首先由小到大的排序  
  oder(base);  
   
  printf("排序结果:");  
  for(int   i=0;i<4;i++)  
  printf("%d     ",base[i]);  
  printf("\n");  
   
  data   first(base[0],24);  
  first.init();  
  int   *one=new   int[4];  
  first.putn(one);  
  while(*one>=0)  
  {  
  data   sencd(base[1],*one);  
  sencd.init();  
  int   *two=new   int[4];  
  sencd.putn(two);  
  while(*two>=0)  
  {  
  data   thred(base[2],*two);  
  thred.init();  
  int   *three=new   int[4];  
  thred.putn(three);  
  while(*three>=0)  
  {  
  if   (*three==base[3])  
  {  
  printf("首先%d和%d可以得到%d\n",base[3],base[2],*two);  
  printf("其次%d和%d可以得到%d\n",base[1],*two,*one);  
  printf("最后%d和%d可以得到24\n",base[0],*one);  
  system("pause");  
  return   1;  
  }  
  three++;  
  }  
  two++;  
  }  
  one++;  
  }  
  printf("can't");  
  system("pause");  
  return   0;  
  }  
  void   oder(int   *num)  
  {  
  for(int   i=0;i<4;i++)  
  for(int   j=0;j<4;j++)  
  {  
  if(num[i]<num[j])  
  {  
  int   tmp=num[i];  
  num[i]=num[j];  
  num[j]=tmp;  
  }  
  }  
  }Top

24 楼51365133(渊海)回复于 2006-03-03 21:10:53 得分 0

我分析了下,上边的用排序有点问题,其实应该用排列最好!!!Top

25 楼teacher1998(英语+asp.net+MsSQL)回复于 2006-03-03 23:24:04 得分 0

记下来Top

26 楼laolou_1983(太阳下山我下班)回复于 2006-03-04 09:37:36 得分 0

关注。。。Top

27 楼DigData(C'est la Vie)回复于 2006-03-04 09:58:48 得分 0

mark  
  Top

28 楼wanyong775(渔民:小小的网少年)回复于 2006-03-04 10:05:57 得分 0

markTop

29 楼101monster(毛毛虫)回复于 2006-03-04 10:08:12 得分 0

呵呵,不错,支持!Top

30 楼S_G_D(紫色)回复于 2006-03-04 12:12:23 得分 0

#include<iostream>  
  using   namespace   std;  
  int   flag=0;  
  void   f(int   n[],int   c[],int   step)  
  { int   x1[4],x[4],y[4];  
  int   i,j;  
  for(i=0;i<4;i++)  
  { x[i]=n[i];  
  x1[i]=n[i];  
  y[i]=c[i];  
  }  
  if(step==4)  
  { if(x[0]==24)  
  flag=1;  
  return;  
  }  
  else  
  for(i=0;i<3;i++)  
  for(j=i+1;j<4;j++)  
  { i+=1-c[i];  
  j+=1-c[j];  
  y[j]=0;  
  x1[i]+=x1[j];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  x1[i]-=x1[j];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  x1[i]=x1[j]-x1[i];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  x1[i]*=x1[j];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  if(x1[j]&&!(x1[i]%x1[j]))  
  { x1[i]/=x1[j];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  }  
  if(x1[i]&&!(x1[j]%x1[i]))  
  { x1[j]/=x1[i];  
  f(x1,y,step+1);  
  x1[i]=x[i];  
  }  
  }  
  }  
  int   main()  
  { int   n[4],c[4]={1,1,1,1};  
  cin>>n[0]>>n[1]>>n[2]>>n[3];  
  f(n,c,1);  
  if(flag)  
  cout<<"Yes!"<<endl;  
  else  
  cout<<"No!"<<endl;  
  return   0;  
  }  
   
  Top

31 楼S_G_D(紫色)回复于 2006-03-04 12:17:06 得分 0

I'v   used   the   recursion   in   the   code   which   in   the   upside,but   I   have   found   a   bug   myself.Top

32 楼firetoucher(风焱)回复于 2006-03-04 12:50:01 得分 0

你可以下载ICM99的程序看看,里面第一题貌似相似。  
   
   
  FYI,我以前的一个,后来没有管了http://blog.csdn.net/firetoucher/archive/2005/12/14/552171.aspxTop

33 楼DelphiGuy()回复于 2006-03-04 13:05:37 得分 0

加上运算符(包括括号),总共只有580608中可能。  
  先穷举生成查找表,每次查找就行了。  
  Top

34 楼systemx(-操!老子从不讲脏话的!阿弥陀佛!-)回复于 2006-03-04 13:35:18 得分 0

 
   
  强帖。。收藏。。学习Top

35 楼fdimim(猿莫求愚√))回复于 2006-03-04 13:42:49 得分 0

++++++++++++++++++++++++++++++++++++++Top

36 楼lay6(6lay)回复于 2006-03-04 16:30:14 得分 0

递归。。。  
  4个数合3个数。。  
  3个数合2个数。。  
  2个数合1个数。。  
   
  1个数是24就成功。。。Top

37 楼wenxueqian()回复于 2006-03-04 18:45:18 得分 0

高手如云,佩服!Top

38 楼bbuugg(测试员)回复于 2006-03-04 23:06:58 得分 0

且慢说高手如云,俺测了一下给出的代码  
  结果如下:  
   
  adintr(www.adintr.com)   的代码  
  根本无法得出结果总是跳出一句  
  Select   Must   Less   Than   Count  
   
  To:51365133(渊海)    
  2   4   6   7   可以计算的2*7+4+6,可是你的代码说can't  
   
  To:S_G_D(紫色)  
  1   2   7   7   应该有解(7*7-1)/2,可是你的代码说No!Top

39 楼51365133(渊海)回复于 2006-03-05 03:26:20 得分 0

//个人分析,有一定的错误希望高手,进一步指点  
   
  我想首先说下24的算法逆序分析  
   
  给出4个数,确认我们的结果是24  
   
  //第一次取数   求组合  
  我们首先从4个数中取出一个数,和我们的结果24进行   求       加,减,乘,除   4个数的组合  
  因为得到的加减乘除的组合   和   我们取出的数   通过反向的   减,加,除,乘   是可以得到结果24  
   
  //第二次取数   求组合  
  然后从剩下的3个数中与   第一个数得到的加减乘除的组合   中的一个值   在进行   加减乘除   运算  
  这与上个数与24求   加减乘除的   思想是一样的.这次取出的数   通过反向操作可以得到上次的组合值  
  这次取出的数反向操作与上次取出的数相反操作同样可以得到24  
   
  //第三次取数   求组合  
  最后一次从剩下的2个数中取出一个值,与第2次得到   加减乘除组合中的一个数作   加减乘除   运算  
  这次得到的组合与前两次的思想是一样的  
   
  //最后判断   组合中的数是否与最后一个数相同  
  然后判断   第4个数,也就是剩下的数是否在最后一次得到的组合中出现,  
   
  如果出现的情况,表明:  
   
  第4个数与第3个数可以得到   第二次取数的组合中的一个值  
  第二次组合中的值与第2个取出的数,进行反向操作就得到了第一次组合中的一个值,  
  最后第1个数与第一次组合中的值可以得到24这个最终结果  
   
  这种分析,不是完全正确,但是希望给大家一定的帮助  
   
                                                                                        渊海  
   
   
   
   
   
   
  Top

40 楼jsbanwjly(我自痴狂)回复于 2006-03-05 10:20:51 得分 0

MARKTop

41 楼bbuugg(测试员)回复于 2006-03-05 10:44:15 得分 0

To   51365133(渊海)  
  你的算法中对以下这种情况,如   5,7,8,10,无能为力  
  这道题只有一种解法   (5+7)*(10-8)  
  这种解法无法依靠每次取一个数的算法求得Top

42 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-03-05 10:50:43 得分 0

fxt,permutations  
  http://www.jjj.de/fxt/Top

43 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 11:04:46 得分 0

to   bbuugg(测试员):  
   
  adintr(www.adintr.com)   的代码  
  根本无法得出结果总是跳出一句  
  Select   Must   Less   Than   Count  
   
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`  
  说说具体情况,  
  用的什么数据,  
  我运行的时候没有出现啊。。Top

44 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 11:28:00 得分 0

to   bbuugg(测试员):  
   
  adintr(www.adintr.com)   的代码  
  根本无法得出结果总是跳出一句  
  Select   Must   Less   Than   Count  
   
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`  
  这里有一份编译好的,你再试试呢?  
  如果出现问题,记录一下是在哪组数据中出的问题吗  
  http://www.adintr.com/map.htm?id=down&arg=id=900005Top

45 楼bbuugg(测试员)回复于 2006-03-05 12:20:50 得分 0

To   adintr(www.adintr.com)  
  我是用VC++6.0   window   XP环境编译的。  
  另外http://www.adintr.com/map.htm?id=down&arg=id=900005  
  打不开Top

46 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 13:07:07 得分 0

to   bbuugg(测试员)   :  
  怎么会打不开啊,  
  能   ping   通么?  
  方便的话可以给个邮箱,我发给你吗。  
  或者再试试这个链接:  
  http://www.freefilehosting.net/?id=q9DxlazZ  
   
  另,我原来是用   gcc   编译的。Top

47 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 13:27:53 得分 0

另,我用   VC2003   编译了一下,会出现   Unknown   Except!   异常,  
  这是程序中有点问题,把   Test24   函数中的  
    int   c_kh=std::count(&num->Getdesc(0).c_str()[0],&num->Getdesc(0).c_str()[0]+num->Getdesc(0).size(),'(');  
                                          if(c_kh>1)  
                                                  ++times;  
                                          else  
   
   
  改为  
    std::string   resout   =   num->Getdesc(0);  
    int   c_kh   =   static_cast<int>(std::count(&(resout.c_str()[0]),   &resout.c_str()[0]   +   resout.size(),   '('));  
    if(c_kh>1)  
          ++times;  
    else  
  Top

48 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 13:31:35 得分 0

在   gcc   中居然可以运行正常~~   寒一个  
  这段代码限制了括号也只能使用一次,如果要去掉这个限制,可直接注释掉这段代码。  
  我这里没有   VC6.0,   所以没办法在   6.0   下试了。Top

49 楼wxyeeis(雨)回复于 2006-03-05 14:33:07 得分 0

markTop

相关问题

  • 求大家给个算法?
  • 谁给一个树的算法给我?
  • 猴子分桃。请给出算法
  • 给大家出一道算法题?
  • 这个算法儿不给分
  • 谁能给我TDU加密算法?
  • 请高手给个提示(算法)
  • 给个base64的算法好吗
  • 给出洗牌的一个算法
  • 谁能帮我给个算法,急

关键词

  • c++
  • 组合
  • 算法
  • 括号
  • getdesc
  • 个数
  • 操作符
  • descr
  • setdata
  • num

得分解答快速导航

  • 帖主:vecen

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo