24点算法

 感觉这个程序是在七拼八凑..-_-||
#include  " stdio.h " // 24点算法 
#include  " stdlib.h "
int  main()
{
    
int ss(int ,int ,int ,int );
    
void pre(int*,int,int);
    
int k=0,a[4];
    scanf(
"%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);
    ss(a[
0],a[1],a[2],a[3]);
    
while(++k<24){
                  pre(a,
24,k);
                  ss(a[
0],a[1],a[2],a[3]);
                  }

    system(
"pause");
    
return 0;
}

void  pre( int  a[], int  i, int  k) // 全排列 
{
     
int t,j,e;
     
if(k<i){
          
for(e=k,j=1;!(e%(j+1));e/=j,j++);//交换第几位 
          
          
for(e=1;e*2<j;e++)
          
{t=a[e];a[e]=a[j-e];a[j-e]=t;}//位中排序 
              
          t
=a[j];a[j]=a[0];a[0]=t;}

}

int  ss( int  a, int   b, int   c, int  d) // 符号枚举 
{
    
void account(int*,int*,int,int);
    
int e,f,g,res1,res2,res3;
    
char sign[]={'+','*','-','/','#','$'};
    
for(e=0;e<4;e++)
      
for(f=0;f<6;f++)
        
for(g=0;g<6;g++)
        
{
        res1
=a;res2=1;
        account(
&res1,&res2,e,b);
        account(
&res1,&res2,f,c);
        account(
&res1,&res2,g,d);//((a?b)?c)?d
        if(res2!=0 && res1%res2==0 && res1/res2==24){//((a?b)?c)?d
              if(f>=4 && g<4)printf("(%d %c (%d %c %d)) %c %d ",c,sign[f-2],a,sign[e],b,sign[g],d);
              
else if(f>=4 &&g>=4)printf("%d %c (%d %c (%d %c %d)) ",d,sign[g-2],c,sign[f-2],a,sign[e],b);
              
else if(f<4 && g>=4)printf("%d %c ((%d %c %d) %c %d) ",d,sign[g-2],a,sign[e],b,sign[f],c);
              
else printf("((%d %c %d) %c %d) %c %d ",a,sign[e],b,sign[f],c,sign[g],d);
              }

        
if(g==2){
        res1
=a;res2=1;
        account(
&res1,&res2,e,b);
        account(
&res1,&res2,f,c-d);
        
if(res2!=0 && res1%res2==0 && res1/res2==24){//(a?b)?(c?d)
           if(f>=4)printf("(%d %c %d) %c (%d %c %d) ",c,sign[g],d,sign[f-2],a,sign[e],b);
           
else printf("(%d %c %d) %c (%d %c %d) ",a,sign[e],b,sign[f],c,sign[g],d);
           }

        }

        }

    
return 0;
}

void  account( int   * a, int   * b, int  sig, int  num)
{
    
int res1,res2,t;
    res1
=*a;res2=*b;
         
if(sig==0)res1+=num*res2;
    
else if(sig==2)res1-=num*res2;
    
else if(sig==1)res1*=num;
    
else if(sig==3)res2*=num;
    
else if(sig==4)res1=num*res2-res1;
    
else if(sig==5){t=res1;res1=res2;res2=t;res1*=num;}
    
*a=res1;*b=res2;        
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值