|   
ko20010214 
版主
 
        
 
  
 
积分 7294 
发帖 1628 
注册 2002-10-16 
状态 离线
 | 
『楼 主』:
 计算24的程序--C语言编程例题[转帖]
 
使用 LLM 解释/回答一下
  
发信人: wfaye (打倒北约), 信区: GreatTurn 
标  题: 计算24的程序 
发信站: BBS 水木清华站 (Wed Feb  7 10:48:30 2001) 
 
看大家一直在孜孜以求的计算24, 不如贴个程序出来, 
可以在1秒种之内解决任何计算24的问题.  当然想算25, 26... 
也是可以的. 希望以此作为24问题的终结. 
 
#include "stdafx.h" 
// 
//原理, 将4个数字和3个运算符按"波兰表达式"组成一个序列, 
//  计算该序列的值是否为所求目标. 可以对这个序列的组成 
//  进行遍历, 以确定是否有解. 
//根据我的计算如果只限于用1-10之间的数字计算24, 总共有 
//  715个不同的题目, 其中566个有解. 如果是1-13, 则有 
//  1820个不同的题目, 其中1362个有解 
// 
int total = 0; //解的个数 
int sp;   //当前表达式栈指针 
int s;  //表达式栈 
void Evaluate(int& fz, int& fm) 
//计算表达式的值, fz, fm为计算结果的分子, 分母 
{ 
 int op, l, m, opn; 
 op = s;  //取栈顶元素 
 for (l = 0; l  0) //是数字 
  { 
   opn = m; 
   opn = 1; 
  } 
  else //是运算符 
   Evaluate(opn, opn); 
 } 
 //根据运算符进行计算 
 //opn/opn 是第一个操作数, 
 //opn/opn 是第二个操作数, 
 switch (op) 
 { 
 case -4:  //乘法 
  fz = opn * opn; 
  fm = opn * opn; 
  break; 
 case -3:  //加法 
  fz = opn * opn + opn * opn; 
  fm = opn * opn; 
  break; 
 case -2:  //减法 
  fz = opn * opn - opn * opn; 
  fm = opn * opn; 
  break; 
 case -1:  //除法 
  fz = opn * opn; 
  fm = opn * opn; 
  break; 
 } 
} 
void Display(CString& m) 
//将表达式转换为字符串 
{ 
 int i; 
 CString n; 
 m = ""; 
 for (i = 0; i < 7; i++) 
 { 
  switch (s) 
  { 
  case -4: m += "  *"; break; 
  case -3: m += "  +"; break; 
  case -2: m += "  -"; break; 
  case -1: m += "  /"; break; 
  default: n.Format("%3d", s); m += n; break; 
  } 
 } 
} 
void Compute(int target, int a, int b, int c, int d, CStringArray& ma) 
// target - 计算结果(一般为24) 
// a, b, c, d - 参加计算的4个数 
// ma - 解的字符串表达形式 
{ 
 int l1, l2, l3, op1, op2, op3; 
 int l, fz, fm, num; 
 CString m; 
 
 //记录表达式中间四个元素的排列方式 
 //  其中loc, loc表示第二, 第三两个运算符的位置 
 //      loc, loc表示第一, 第二两个操作数的位置 
 int loc = {{1, 2, 3, 4}, {1, 3, 2, 4}, {1, 4, 2, 3}, 
      {2, 3, 1, 4}, {2, 4, 1, 3}}; 
 //num中记录a, b, c, d的一个排列 
 for (l1 = 0; l1 < 4; l1++) 
 { 
  num = a; 
  for (l2 = 0; l2 < 4; l2++) 
  { 
   if (l2 == l1) continue; 
   num = b; 
   for (l3 = 0; l3 < 4; l3++) 
   { 
    if (l3 == l1 || l3 == l2) continue; 
    num = c; 
    num = d; 
    //表达式最后两个必须是数字 
    s = num; 
    s = num; 
    for (l = 0; l < 5; l++) 
    { 
     s] = num; 
     s] = num; 
     for (op1 = -4; op1 < 0; op1++) 
     { 
      //表达式第一个必须运算符 
      s = op1; 
      for (op2 = -4; op2 < 0; op2++) 
      { 
       s] = op2; 
       for (op3 = -4; op3 < 0; op3++) 
       { 
        s] = op3; 
        sp = 0; 
        Evaluate(fz, fm); 
        //分母不为0, 可以整除, 商为24表示计算成功 
        if (fm != 0 && fz % fm == 0 && fz / fm == target) 
        { 
         Display(m); 
         ma.Add(m); 
         total++; 
         //这里加return就是只求一个解, 
         //否则是求出全部解(没有考虑剔除重复解) 
         return; 
        } 
       } 
      } 
     } 
    } 
   } 
  } 
 } 
} 
 
-- 
 
※ 来源:·BBS 水木清华站 smth.org· 
 
(本文采用S-Term文章拷贝脚本拷贝) 
================================================== 
 
 
    
 
  
  |  
                  
  
                    ko20010214  
================================= 
大功告成,打个Kiss!  
ko20010214@MSN.com  
神州优雅Q300C 
Intel CeleronM 370处理器 | 256MbDDR内存 
40G硬盘 | USB2.0 | IEEE 1394 
13.3 ' WXGA 宽屏(16:10) | COMBO光驱 
10/100M网卡 | 四合一读卡器 
 |   
 |  
  2003-6-15 00:00 | 
  
 |  
 |   
ko20010214 
版主
 
        
 
  
 
积分 7294 
发帖 1628 
注册 2002-10-16 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
再贴一个程序: 
也是清华的,算24的程序。 
#include  
#include  
int get1(int (*p1),char (*p2)) 
{  int temp; 
    switch((*p2)) 
    {    case 0: temp=(*p1)+(*p1); break; 
case 1: temp=(*p1)-(*p1); break; 
case 2: temp=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    temp=(*p1)/(*p1); 
      break; 
} 
else return(0); 
    } 
    switch((*p2)) 
    {    case 0: temp+=(*p1); break; 
case 1: temp-=(*p1); break; 
case 2: temp*=(*p1); break; 
case 3: if ((*p1)&&(temp%(*p1)==0)) 
{    temp=temp/(*p1); 
      break; 
  } 
  else return(0); 
    } 
      switch((*p2)) 
    {    case 0: temp+=(*p1); break; 
case 1: temp-=(*p1); break; 
case 2: temp*=(*p1); break; 
case 3: if ((*p1)&&(temp%(*p1)==0)) 
{    temp=temp/(*p1); 
      break; 
  } 
  else return(0); 
    } 
    return(temp); 
} 
int get2(int (*p1),char (*p2)) 
{  int temp; 
    switch((*p2)) 
    {    case 0: temp=(*p1)+(*p1); break; 
case 1: temp=(*p1)-(*p1); break; 
case 2: temp=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    temp=(*p1)/(*p1); 
      break; 
} 
else return(0); 
    } 
    switch((*p2)) 
    {    case 0: temp=(*p1)+temp; break; 
case 1: temp=(*p1)-temp; break; 
case 2: temp=(*p1)*temp; break; 
case 3: if ((temp)&&((*p1)%temp==0)) 
{    temp=(*p1)/temp; 
      break; 
  } 
  else return(0); 
    } 
      switch((*p2)) 
    {    case 0: temp+=(*p1); break; 
case 1: temp-=(*p1); break; 
case 2: temp*=(*p1); break; 
case 3: if ((*p1)&&(temp%(*p1)==0)) 
{    temp=temp/(*p1); 
      break; 
  } 
  else return(0); 
    } 
    return(temp); 
} 
int get3(int (*p1),char (*p2)) 
{  int temp; 
    switch((*p2)) 
    {    case 0: temp=(*p1)+(*p1); break; 
case 1: temp=(*p1)-(*p1); break; 
case 2: temp=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    temp=(*p1)/(*p1); 
      break; 
} 
else return(0); 
    } 
    switch((*p2)) 
    {    case 0: temp+=(*p1); break; 
case 1: temp-=(*p1); break; 
case 2: temp*=(*p1); break; 
case 3: if ((*p1)&&(temp%(*p1)==0)) 
{    temp=temp/(*p1); 
      break; 
  } 
  else return(0); 
    } 
      switch((*p2)) 
    {    case 0: temp=(*p1)+temp; break; 
case 1: temp=(*p1)-temp; break; 
case 2: temp=(*p1)*temp; break; 
case 3: if ((temp)&&(*p1)%temp==0) 
{    temp=(*p1)/temp; 
      break; 
  } 
  else return(0); 
    } 
    return(temp); 
} 
int get4(int (*p1),char (*p2)) 
{  int temp; 
    switch((*p2)) 
    {    case 0: temp=(*p1)+(*p1); break; 
case 1: temp=(*p1)-(*p1); break; 
case 2: temp=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    temp=(*p1)/(*p1); 
      break; 
} 
else return(0); 
    } 
    switch((*p2)) 
    {    case 0: temp=(*p1)+temp; break; 
case 1: temp=(*p1)-temp; break; 
case 2: temp=(*p1)-temp; break; 
case 3: if ((temp)&&(*p1)%temp==0) 
{    temp=(*p1)/temp; 
      break; 
  } 
  else return(0); 
    } 
      switch((*p2)) 
    {    case 0: temp=(*p1)+temp; break; 
case 1: temp=(*p1)-temp; break; 
case 2: temp=(*p1)*temp; break; 
case 3: if ((temp)&&(*p1)==0) 
{    temp=(*p1)/temp; 
      break; 
  } 
  else return(0); 
    } 
    return(temp); 
} 
int get5(int (*p1),char (*p2)) 
{  int tmp1,tmp2; 
    switch((*p2)) 
    {    case 0: tmp1=(*p1)+(*p1); break; 
case 1: tmp1=(*p1)-(*p1); break; 
case 2: tmp1=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    tmp1=(*p1)/(*p1); 
      break; 
} 
else return(0); 
    } 
    switch((*p2)) 
    {    case 0: tmp2=(*p1)+(*p1); break; 
case 1: tmp2=(*p1)-(*p1); break; 
case 2: tmp2=(*p1)*(*p1); break; 
case 3: if ((*p1)&&((*p1)%(*p1)==0)) 
{    tmp2=(*p1)/(*p1); 
      break; 
  } 
  else return(0); 
    } 
      switch((*p2)) 
    {    case 0: tmp1+=tmp2; break; 
case 1: tmp1-=tmp2; break; 
case 2: tmp1*=tmp2; break; 
case 3: if ((tmp2)&&(tmp1%tmp2==0)) 
{    tmp1/=tmp2; 
      break; 
  } 
  else return(0); 
    } 
    return(tmp1); 
} 
void main() 
{    int num,(*pp1),input,goal,i,j,k,m,n; 
    char (*pp2),code; 
    cout<>goal; 
    cout<<"Input four numbers:"; 
    for(i=0;i>input; 
    m=0; 
    for(i=0;i<4;i++) 
    for(j=0;j<4;j++) 
    for(k=0;k<4;k++) 
    {    code=i; 
  code=j; 
  code=k; 
  m++; 
    } 
    n=0; 
    for(i=0;i<4;i++) 
    for(j=0;j<4;j++) 
    if (j!=i) for(k=0;k<4;k++) 
      if ((k!=i)&&(k!=j)) {  m=6-i-j-k; 
      num=input; 
      num=input; 
      num=input; 
      num=input; 
      n++; 
  } 
    m=0; 
    for(i=0,pp1=num;i<24;i++,pp1++) 
    {    for(j=0,pp2=code;j<64;j++,pp2++) 
{  k=get1(pp1,pp2); if (k==goal) {m=1; break;} 
    k=get2(pp1,pp2); if (k==goal) {m=2; break;} 
    k=get3(pp1,pp2); if (k==goal) {m=3; break;} 
    k=get4(pp1,pp2); if (k==goal) {m=4; break;} 
    k=get5(pp1,pp2); if (k==goal) {m=5; break;} 
} 
if(m) break; 
    } 
    if(m) 
    {    char analyst; 
  for(i=0;i<3;i++) 
  switch((*pp2)) 
  {    case 0<img src="images/smilies/face-sad.png" align="absmiddle" border="0">*pp2)='+'; break; 
      case 1<img src="images/smilies/face-sad.png" align="absmiddle" border="0">*pp2)='-'; break; 
      case 2<img src="images/smilies/face-sad.png" align="absmiddle" border="0">*pp2)='*'; break; 
      case 3<img src="images/smilies/face-sad.png" align="absmiddle" border="0">*pp2)='/'; 
  } 
  switch (m) 
  {    //The following may be hard to understand! 
      //See how and why to do in the end of the program! 
      // ( ( a ? b ) ? c ) ? d          ?=+,-,*,/ 
      // 0 1 2 3 4 5 6 7 8 9 10 
      case 1:strcpy(analyst,"((a?b)?c)?d"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
      analyst=(*pp2); 
      analyst=(*pp2); 
      analyst=(*pp2); 
      if((analyst=='*')||(analyst=='/')|| 
(analyst=='+')||(analyst=='-')) 
      {  analyst='0';    analyst='0';  } 
      if((analyst=='*')||(analyst=='/')|| 
(analyst=='+')||(analyst=='-')) 
      {  analyst='0';    analyst='0';  } 
      break; 
      // ( a ? ( b ? c ) ) ? d 
      // 0 1 2 3 4 5 6 7 8 9 10 
      case 2:strcpy(analyst,"(a?(b?c))?d"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
      analyst=(*pp2); 
      analyst=(*pp2); 
      analyst=(*pp2); 
      if((analyst=='+')||(analyst!='/')&& 
((analyst=='*')||(analyst=='/'))) 
      {  analyst='0';    analyst='0';  } 
      if((analyst=='*')||(analyst=='/')|| 
(analyst=='+')||(analyst=='-')) 
      {  analyst='0';    analyst='0';  } 
      break; 
      // a ? ( ( b ? c ) ? d ) 
      // 0 1 2 3 4 5 6 7 8 9 10 
      case 3:strcpy(analyst,"a?((b?c)?d"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
      analyst=(*pp2); 
      analyst=(*pp2); 
      analyst=(*pp2); 
      if((analyst=='*')||(analyst=='/')|| 
(analyst=='+')||(analyst=='-')) 
      {  analyst='0';    analyst='0';  } 
      if((analyst=='+')||(analyst!='/')&& 
((analyst=='*')||(analyst=='/'))) 
      {  analyst='0';    analyst='0';  } 
      break; 
      // a ? ( b ? ( c ? d ) ) 
      // 0 1 2 3 4 5 6 7 8 9 10 
      case 4:strcpy(analyst,"a?(b?(c?d))"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
      analyst=(*pp2); 
      analyst=(*pp2); 
      analyst=(*pp2); 
      if((analyst=='+')||(analyst!='/')&& 
((analyst=='*')||(analyst=='/'))) 
      {  analyst='0';    analyst='0';  } 
      if((analyst=='+')||(analyst!='/')&& 
((analyst=='*')||(analyst=='/'))) 
      {  analyst='0';    analyst='0';  } 
      break; 
      // ( a ? b ) ? ( c ? d ) 
      // 0 1 2 3 4 5 6 7 8 9 10 
      case 5:strcpy(analyst,"(a?b)?(c?d)"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
      analyst=(*pp2); 
      analyst=(*pp2); 
      analyst=(*pp2); 
      if((analyst=='*')||(analyst=='/')|| 
(analyst=='+')||(analyst=='-')) 
      {  analyst='0';    analyst='0';  } 
      if((analyst=='+')||(analyst!='/')&& 
((analyst=='*')||(analyst=='/'))) 
      {  analyst='0';    analyst='0';  } 
  } 
  for(i=0;i<11;i++) 
  switch(analyst) 
  {    case 'a': cout<<(*pp1); break; 
      case 'b': cout<<(*pp1); break; 
      case 'c': cout<<(*pp1); break; 
      case 'd': cout<<(*pp1); break; 
      case '0': break; 
      default:  cout<<analyst; 
  } 
  cout<<endl; 
    } 
    else 
    {    for(i=0,pp1=num;i<24;i++,pp1++) 
{    j=(*pp1)*(*pp1); 
      k=(*pp1)*(*pp1); 
              if(k%(*pp1)==0) 
              {    k/=(*pp1); 
                    if(j+k==goal) {    m=1;  break;  } 
                    else if(j-k==goal) {    m=2;  break;  } 
else if(k-j==goal) {    m=3;  break;    } 
              } 
      else 
              {    j=(*pp1)*(*pp1); 
                    k=(*pp1)*(*pp1); 
                    n=(*pp1); 
    if((k+n)&&(j%(k+n)==0)) 
    {    if(j/(k+n)==goal) 
{    m=4;  break;    } 
                    } 
                    else 
    if((k-n)&&(j%(k-n)==0)) 
                    if(j/(k-n)==goal)  {    m=5;  break;  } 
                    else if(j/(n-k)==goal) {    m=6;  break;    } 
              } 
        } 
if(!m) cout<<"If you get it,please E-mail to:publicfrk@netease.com\n"; 
else  switch (m) 
      {    case 1:cout<<(*pp1)<<"*("<<(*pp1)<<'+' 
  <<(*pp1)<<'/'<<(*pp1)<<')'<<endl; 
  break; 
    case 2:cout<<(*pp1)<<"*("<<(*pp1)<<'-' 
  <<(*pp1)<<'/'<<(*pp1)<<')'<<endl; 
  break; 
    case 3:cout<<(*pp1)<<"*("<<(*pp1)<<'/' 
  <<(*pp1)<<'-'<<(*pp1)<<')'<<endl; 
  break; 
    case 4:cout<<(*pp1)<<"/("<<(*pp1)<<'+' 
  <<(*pp1)<<'/'<<(*pp1)<<')'<<endl; 
  break; 
    case 5:cout<<(*pp1)<<"/("<<(*pp1)<<'-' 
  <<(*pp1)<<'/'<<(*pp1)<<')'<<endl; 
  break; 
    case 6:cout<<(*pp1)<<"/("<<(*pp1)<<'/' 
  <<(*pp1)<<'-'<<(*pp1)<<')'<<endl; 
} 
    } 
} 
// .T. means you can get ride of ( ) 
//      a?(b?c) (a?b)?c 
//              +  +    .T.   .T. 
// +  -    .T.                              .T. 
// +  *    .T.                              .F. 
//              +  /    .T.                              .F. 
// -  +    .F.                              .T. 
//              -  -    .F.                              .T. 
// -  *    .T.                              .F. 
//         -  /    .T.                              .F. 
//              *  +    .F.                              .T. 
//              *  -    .F.                              .T. 
//              *  *    .T.                              .T. 
//              *  /    .T.                              .T. 
//              /  +    .F.                              .T. 
//              /  -    .F.                              .T. 
// /  *    .F.                              .T. 
//              /  /    .F.                              .T. 
//---------------------------------------------------------------- 
//Conculsion    +    +,-,*,/                  *,/    +,-,*,/ 
//            *,-    *,/ 
 
 
 
    
 
  
  |  
                  
  
                    ko20010214  
================================= 
大功告成,打个Kiss!  
ko20010214@MSN.com  
神州优雅Q300C 
Intel CeleronM 370处理器 | 256MbDDR内存 
40G硬盘 | USB2.0 | IEEE 1394 
13.3 ' WXGA 宽屏(16:10) | COMBO光驱 
10/100M网卡 | 四合一读卡器 
 |   
 |  
  2003-6-15 00:00 | 
  
 |  
 |   
ko20010214 
版主
 
        
 
  
 
积分 7294 
发帖 1628 
注册 2002-10-16 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
再贴一个程序:也是清华的, 算24程序终结版(TC20) 
 
 
/*TO24 lasy 2002.01.25*/ 
 
#define PRE 1E-6 
#define DES 24.0 
 
#include  
#include  
 
double add(double a,double b){return a+b;} 
double sub(double a,double b){return a-b;} 
double mul(double a,double b){return a*b;} 
double div(double a,double b){return a/b;} 
 
double (*fun)(double,double)={add,sub,mul,div}; 
const char op={'+','-','*','/'}; 
 
struct num 
{ 
        double f; 
        struct num *a,*b; 
        char op; 
}; 
 
char to24(int n,struct num *f); 
char output(struct num f); 
char *fml(struct num f); 
 
main() 
{ 
        int i,tmp; 
        struct num f; 
        for(i=0;i<4;i++) 
        { 
                printf("\nInput Number %d:",i+1); 
                scanf("%d",&tmp); 
                f.f=(double)tmp;f.a=f.b=NULL;f.op=0; 
        } 
        printf("\nSolutions:\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
        if(to24(4,f)==0)printf("None!"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
} 
 
char to24(int n,struct num *f) 
{ 
        char flag=0,*tmp; 
        int i,j,k,l; 
        struct num *h; 
        if(n==1) 
        { 
                if(fabs(f.f-DES)<PRE)flag=output(f); 
        } 
        else 
        { 
                for(i=0;i<n;i++)for(j=i+1;j<n;j++)for(k=0;k<4;k++) 
                { 
                        h=(struct num *)malloc((n-1)*sizeof(struct num)); 
                        for(l=0;l<i;l++)h=f; 
                        for(l=i+1;l<j;l++)h=f; 
                        for(l=j;lPRE) 
                        { 
                                h.f=fun(f.f,f.f); 
                                h.a=f+i; 
                                h.b=f+j; 
                                flag=to24(n-1,h)||flag; 
                        } 
                        if(k==1||(k==3&&fabs(f.f)>PRE)) 
                        { 
                                h.f=fun(f.f,f.f); 
                                h.a=f+j; 
                                h.b=f+i; 
                                flag=to24(n-1,h)||flag; 
                        } 
                        free(h); 
                } 
        } 
        return flag; 
} 
 
char output(struct num f) 
{ 
        static int count=0; 
        char *tmp; 
        count++; 
        printf("%3d: %s\t",count,tmp=fml(f)); 
        if(count%3==0)printf("\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
        free(tmp); 
        return 1; 
} 
 
char *fml(struct num f) 
{ 
        char *buf,*a,*b; 
        buf=(char *)malloc(20*sizeof(char)); 
        if(f.a!=NULL&&f.b!=NULL&&f.op!=0) 
        { 
                sprintf(buf,"(%s%c%s)",a=fml(*f.a),f.op,b=fml(*f.b)); 
                free(a);free(b); 
        } 
        else 
                sprintf(buf,"%d",(int)f.f); 
        return buf; 
} 
 
 
========================== 
KO的话:用编程来解决求24的问题,爽! 
有没有人看得懂啊?回个贴。 
 
    
 
  
  |  
                  
  
                    ko20010214  
================================= 
大功告成,打个Kiss!  
ko20010214@MSN.com  
神州优雅Q300C 
Intel CeleronM 370处理器 | 256MbDDR内存 
40G硬盘 | USB2.0 | IEEE 1394 
13.3 ' WXGA 宽屏(16:10) | COMBO光驱 
10/100M网卡 | 四合一读卡器 
 |   
 |  
  2003-6-15 00:00 | 
  
 |  
  |