| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1026 人关注过本帖
标题:算24,望能帮忙改进!
取消只看楼主 加入收藏
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
结帖率:83.33%
收藏
已结贴  问题点数:40 回复次数:6 
算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
空沃夫
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
来 自:老和山职业技术学院
等 级:论坛游民
帖 子: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: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
回复 10楼 神龙赖了
嗯,谢谢!
只是就算是把循环改了,依旧无法解决我之前提出的问题,搞个printf后,出现的那个"syntax error at end of input",
不知道后面有没有大神能给出这个问题解答,分数奉上!
2012-12-28 23:22
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
回复 15楼 laoyang103
大神。。
2012-12-29 16:34
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
回复 15楼 laoyang103
,不过我现在一个很大的问题就如我在12楼中提到的关于printf的问题,求指教。
2012-12-29 16:39
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
虽然只有40分(此号还只是新的),大神们别嫌少啊~~~,。自顶下
2012-12-29 21:24
快速回复:算24,望能帮忙改进!
数据加载中...
 
   



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

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