计算24点程序代码

41 篇文章 4 订阅
32 篇文章 9 订阅

如何计算二十四点

第一种代码

#include<stdio.h>
char mark[4]={'+','-','*','/'};
float cal(float x,float y,int mark)
{
  switch(mark)
  {
    case 0:return x+y;
    case 1:return x-y;
    case 2:return x*y;
    case 3:return x/y;
  }
}
float calculate_A(float a,float b,float c,float d,int mark1,int mark2,int mark3)
{
  float r1,r2,r3;
  r1=cal(a,b,mark1);
  r2=cal(r1,c,mark2);
  r3=cal(r2,d,mark3);
  return r3;
}
float calculate_B(float a,float b,float c,float d,int mark1,int mark2,int mark3)
{
  float r1,r2,r3;
  r1=cal(b,c,mark2);
  r2=cal(a,r1,mark1);
  r3=cal(r2,d,mark3);
  return r3;
}
float calculate_C(float a,float b,float c,float d,int mark1,int mark2,int mark3)
{
  float r1,r2,r3;
  r1=cal(c,d,mark3);
  r2=cal(b,r1,mark2);
  r3=cal(a,r2,mark1);
  return r3;
}
float calculate_D(float a,float b,float c,float d,int mark1,int mark2,int mark3)
{
  float r1,r2,r3;
  r1=cal(b,c,mark2);
  r2=cal(r1,d,mark3);
  r3=cal(a,r2,mark1);
  return r3;
}
float calculate_E(float a,float b,float c,float d,int mark1,int mark2,int mark3)
{
  float r1,r2,r3;
  r1=cal(a,b,mark1);
  r2=cal(c,d,mark3);
  r3=cal(r1,r2,mark2);
  return r3;
}
float get(int a,int b,int c,int d)
{
  int mark1,mark2,mark3;
  float flag=0;
  for(mark1=0;mark1<4;mark1++)
  {
    for(mark2=0;mark2<4;mark2++)
    {
      for(mark3=0;mark3<4;mark3++)
      {
        if(calculate_A(a,b,c,d,mark1,mark2,mark3)==24)
        {
          printf("((%d%c%d)%c%d)%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
          flag=1;
        }
        if(calculate_B(a,b,c,d,mark1,mark2,mark3)==24)
        {
          printf("(%d%c(%d%c%d))%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
          flag=1;
        }
        if(calculate_C(a,b,c,d,mark1,mark2,mark3)==24)
        {
          printf("%d%c(%d%c(%d%c%d))=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
          flag=1;
        }
        if(calculate_D(a,b,c,d,mark1,mark2,mark3)==24)
        {
          printf("%d%c((%d%c%d)%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
          flag=1;
        }
        if(calculate_E(a,b,c,d,mark1,mark2,mark3)==24)
        {
          printf("(%d%c%d)%c(%d%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
          flag=1;
        }
      }
    }
  }
  return flag;
}
main()
{
  int a,b,c,d;
  printf("Please input 4 numbers(1~13):");
  scanf("%d%d%d%d",&a,&b,&c,&d);
    if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13))
    {
      get(a,b,c,d);
    }
      else
      {
        printf("Input illegal,please input again(1~13):");
        scanf("%d%d%d%d",&a,&b,&c,&d);
        if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13))
         {
              get(a,b,c,d);
         }
      }
  system("pause");
}

第二种代码
(输出结果可能会有重复,没有第一种方法严谨)

#include<stdio.h>
int chu(int p,int q)
{
    if(p%q==0)return p/q;
    else
        return 111111;
}
int fun(int i,int j,int c)
{
    int s;
    switch(c)
    {
    case 1:s=i+j;break;
    case 2:s=i-j;break;
    case 3:s=i*j;break;
    case 4:s=chu(i,j);break;
    }
    return s;
}
void print(int c)
{
    if(c==1)printf("+");
    else if(c==2)printf("-");
    else if(c==3)printf("*");
    else printf("/");
}
int main()
{
    int f[4];
    int i,j,m,n;
    int a,b,c;
    int d1,d2,d3;
    scanf("%d%d%d%d",&f[0],&f[1],&f[2],&f[3]);
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            if(j!=i)
                for(m=0;m<4;m++)
                    if(m!=i&&m!=j)
                        for(n=0;n<4;n++)
                            if(n!=i&&n!=j&&n!=m)
    for(a=1;a<5;a++)
        for(b=1;b<5;b++)
            for(c=1;c<5;c++)
            {
                d1=fun(f[i],f[j],a);
                d2=fun(d1,f[m],b);
                d3=fun(d2,f[n],c);
                if(d3==24)
                {
                    printf("%d",f[i]);
                    print(a);
                    printf("%d",f[j]);
                    print(b);
                    printf("%d",f[m]);
                    print(c);
                    printf("%d=24\n",f[n]);
                }
            }
            return 0;
}

测试结果
这里写图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值