| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1026 人关注过本帖
标题:算24,望能帮忙改进!
只看楼主 加入收藏
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
结帖率:83.33%
收藏
已结贴  问题点数:40 回复次数:21 
算24,望能帮忙改进!
程序代码:
#include<stdio.h>
#define s1(a1,b1,c1,d1) a1+b1+c1+d1
#define s2(a2,b2,c2,d2) a2+b2+c2*d2
#define s3(a3,b3,c3,d3) a3+b3*c3*d3
#define s4(a4,b4,c4,d4) a4*b4*c4*d4
//定义运算,这里出现一个弊端就是我的算24是有运算优先级的,就是说是在运算的时候默认是不能加括号的
int main()
{
    int k[4],i,j,p,q;
    int jisuan(int a,int b,int c,int d);
    for(i=0;i<4;i++)
    scanf("%d",&k[i]);
    for(i=0;i<4;i++)        //接下来是将输入的四个数都遍历一遍
           for(j=0;j<4;j++){
                if(j==i) continue;
                for(p=0;p<4;p++){
                   if(p==i||p==j) continue;
                      for(q=0;q<4;q++){
                          if(q==i||q==j||q==p)
                           continue;
                           if(jisuan(k[i],k[j],k[p],k[q])==1){
                           printf("YES");
                           return 0;
                                                              }
                                       }
                                  }     
                             }
                 printf("NO");
                 getchar();
                 getchar();
                 return 0;         
}
int jisuan(int a,int b,int c,int d)
{   
     int result=0,i,j,p,q;
     int za[2]={a,(-1*a)},zb[2]={b,(-1*b)},zc[2]={c,(-1*c)},zd[2]={d,(-1*d)};
     double xa[2]={a,1.0/a},xb[2]={b,1.0/b},xc[2]={c,1.0/c},xd[2]={d,1.0/d};
     //由于我宏定义中的运算只是加法跟乘法,所以我这里再定义出数组中含负数跟倒数的来代替除法跟减法,个人觉得是简便运算了。
     for(i=0;i<=1;i++)
       for(j=0;j<=1;j++)
         for(p=0;p<=1;p++)                    
           for(q=0;q<=1;q++)
              if((s1(za[i],zb[j],zc[p],zd[q]))==24)
              result=1;
      
       for(i=0;i<=1;i++)
         for(j=0;j<=1;j++)
           for(p=0;p<=1;p++)                    
             for(q=0;q<=1;q++)
                if((s2(za[i],zb[j],zc[p],xd[q]))==24)
                  result=1;
      
       for(i=0;i<=1;i++)
         for(j=0;j<=1;j++)
           for(p=0;p<=1;p++)                    
             for(q=0;q<=1;q++)
                if((s3(za[i],zb[j],xc[p],xd[q]))==24)
                  result=1;   
          
       for(i=0;i<=1;i++)
         for(j=0;j<=1;j++)
           for(p=0;p<=1;p++)                    
             for(q=0;q<=1;q++)
                if((s4(za[i],xb[j],xc[p],xd[q]))==24)
                  result=1;   
       //遍历四种运算
       return result;
}


不知道有没有更简便的方法,我等于是用最笨的遍历的方法来处理,同时希望有大神能指导给出可以同一运算优先级的算法。(新手写代码,难免粗陋)
2012-12-28 10:21
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
好强大,这多循环啊,飘过吧

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-28 10:35
jk_love
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:196
专家分:965
注 册:2012-10-22
收藏
得分:0 
确实 有部分不能正确判断出来,等楼主的优化
2012-12-28 14:12
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:2 
除数为零的情况没有判断
2012-12-28 15:10
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
我优化了下,使得运算符能够同级,即无运算优先级,一律从左向右。但是在测试中还是发现了几个数字明明不能弄出24,但还是可以搞出24的,如10 1 1 1.还有一个更大的问题是我只是加了一个输出(我想输出看看是什么运算下使得10 1 1 1可以搞出24的),结果编译的时候就出现说“syntax error at end of input”,具体如
程序代码:
#include<stdio.h>
double yunsuan(double res,int operand2,char c);
void main()
{
     int k[4];
     int i,j,p,q;
     int jisuan (int a,int b,int c,int d);
     for(i=0;i<4;i++)
        scanf("%d",&k[i]);
        for(i=0;i<4;i++)    //将输入的四个数都遍历一遍
           for(j=0;j<4;j++){
                if(j==i) continue;       //避免数出现重复
                for(p=0;p<4;p++){
                   if(p==i||p==j) continue;
                      for(q=0;q<4;q++){
                          if(q==i||q==j||q==p)
                           continue;
                           if(jisuan(k[i],k[j],k[p],k[q])==1){          //判断能不能算出24
                           printf("YES");
                           getchar();getchar();
                           return;
                                                              }
                                       }
                                  }    
                             }
                 printf("NO");
                 getchar();
                 getchar();
      
}

 int jisuan(int a,int b,int c,int d)

 {
     char a1[4]={'+','-','*','/'},b1[4]={'+','-','*','/'},c1[4]={'+','-','*','/'};   //将四种运算保存为字符
     int i,j,q;
     double res;
     for(i=0;i<=4;i++){
       res=a;              
       for(j=0;j<=4;j++)                 
           for(q=0;q<=4;q++){       //对于运算进行遍历
              res= yunsuan(res,b,a1[i]);
              res= yunsuan(res,c,b1[j]);
              res= yunsuan(res,d,c1[q]);
              if(res==24) return 1;
                             }
                        }
       return 0;
}
double yunsuan(double res,int operand2,char c)
{
    switch(c){
            case '+':res=res+operand2;break;
            case '-':res=res-operand2;break;
            case '*':res=res*operand2;break;
            case '/':res=1.0*res/operand2;break;
            }      //对运算字符判断,从而进行运算
   return res;
}
            

 
2012-12-28 20:37
想々
Rank: 2
来 自:新邵
等 级:论坛游民
帖 子:67
专家分:40
注 册:2012-12-23
收藏
得分:0 
给力啊!我也飘过!
2012-12-28 20:38
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
看一看 树的算法

我不懂算法  貌似看过  计算24点是树的经典算法

DO IT YOURSELF !
2012-12-28 20:42
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:8 
程序代码:
#include<stdio.h>
#define n 4
#define m 4
double sumation(double a1, double a2, int o);
int main()
{double sum2,sum3,sum4;
int i1,i2,i3,i4,j1,j2,j3,a[n];                                 //a[]为输入的整数
char op[m]={'+','-','*','/'};                            //op[]为运算符号
printf("4 integers (0-10):  ");
scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);
printf("\n");
for(i1=0;i1<n;i1++)
    {for(i2=0;i2<n;i2++)
        if(i2!=i1)
          {for(j1=0;j1<m;j1++)
              {sum2=sumation(a[i1],a[i2],j1);
               for(i3=0;i3<n;i3++)
                  if(i3!=i1&&i3!=i2)
                    {for(j2=0;j2<m;j2++)
                        {sum3=sumation(sum2,a[i3],j2);
                         for(i4=0;i4<n;i4++)
                            if(i4!=i1&&i4!=i2&&i4!=i3)
                              {for(j3=0;j3<m;j3++)
                                  {sum4=sumation(sum3,a[i4],j3);
                                   if(sum4==24.0)
                                   {if((op[j1]=='+'||op[j1]=='-')&&(op[j2]=='*'||op[j2]=='/'))
                                        printf("(%d %c %d) %c %d %c %d = 24\n",a[i1],op[j1],a[i2],op[j2],a[i3],op[j3],a[i4]);
                                      else
                                      if((op[j2]=='+'||op[j2]=='-')&&(op[j3]=='*'||op[j3]=='/'))
                                          printf("(%d %c %d %c %d) %c %d = 24\n",a[i1],op[j1],a[i2],op[j2],a[i3],op[j3],a[i4]);
                                        else
                                          printf("%d %c %d %c %d %c %d = 24\n",a[i1],op[j1],a[i2],op[j2],a[i3],op[j3],a[i4]);
                                   }
                                  }
                              }
                         }
                    }
               }
           }
    }
    return 0;
}
double sumation(double a1, double a2, int o)
{double sum;
if(o==0)
   sum=a1+a2;
else
   if(o==1)
     sum=a1-a2;
   else
     if(o==2)
       sum=a1*a2;
     else
       {if(a2==0.0)                                 //如果除以零,设置结果为一大数
          sum=100000.0;
        else
          sum=a1/a2;
       }
return sum;
}


如果用递归的话应该简单些,只是逻辑性强些

I have not failed completely
2012-12-28 20:48
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
我只是加了一个 printf,结果就出现了“syntax error at end of input”,求解。。
程序代码:
#include<stdio.h>

 double yunsuan(double res,int operand2,char c);

 void main()

 {
      int k[4];
      int i,j,p,q;
      int jisuan (int a,int b,int c,int d);
      for(i=0;i<4;i++)
         scanf("%d",&k[i]);
         for(i=0;i<4;i++)    //将输入的四个数都遍历一遍
            for(j=0;j<4;j++){
                 if(j==i) continue;       //避免遍历数出现重复
                 for(p=0;p<4;p++){
                    if(p==i||p==j) continue;
                       for(q=0;q<4;q++){
                           if(q==i||q==j||q==p)
                            continue;
                            if(jisuan(k[i],k[j],k[p],k[q])==1){          //判断能不能算出24
                            printf("YES");
                            getchar();getchar();
                            return;
                                                               }
                                        }
                                   }  
                             }
                  printf("NO");
                  getchar();
                  getchar();
     

 }
int jisuan(int a,int b,int c,int d)

 {
      char a1[4]={'+','-','*','/'},b1[4]={'+','-','*','/'},c1[4]={'+','-','*','/'};   //将四种运算保存为字符
      int i,j,q;
      double res;
      for(i=0;i<=4;i++){
        res=a;            
        for(j=0;j<=4;j++)               
            for(q=0;q<=4;q++){       //对于运算进行遍历
               res= yunsuan(res,b,a1[i]);
               res= yunsuan(res,c,b1[j]);
               res= yunsuan(res,d,c1[q]);
               if(res==24) {
                           printf("%d%c%d%c%d%c%d",a,a1[i],b,b1[j],c,c1[q],d);  //就只是这里加了个printf,  
                           return 1;
                              }
                         }
        return 0;

 }

 double yunsuan(double res,int operand2,char c)

 {
     switch(c){
             case '+':res=res+operand2;break;
             case '-':res=res-operand2;break;
             case '*':res=res*operand2;break;
             case '/':res=1.0*res/operand2;break;
             }      //对运算字符判断,从而进行运算
    return res;

 }
    
2012-12-28 20:52
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
程序代码:
 for(i=0;i<=4;i++){         /* 改为i=0;i<4;i++ */
        res=a;           
        for(j=0;j<=4;j++)              
            for(q=0;q<=4;q++){       //对于运算进行遍历
               res= yunsuan(res,b,a1[i]);
               res= yunsuan(res,c,b1[j]);
               res= yunsuan(res,d,c1[q]);
               if(res==24) {
                           printf("%d%c%d%c%d%c%d",a,a1[i],b,b1[j],c,c1[q],d);  //当i=4时a1[4]没有任何意义,a1[3]为最后一个数组元素,for(j=0;j<4;j++),j循环也需改下
                           return 1;
                              }
                         }

I have not failed completely
2012-12-28 21:51
快速回复:算24,望能帮忙改进!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055480 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved