专栏首页图灵技术域计算24点程序代码

计算24点程序代码

如何计算二十四点代码合集

概述

给定4个整数,其中每个数字只能使用一次;任意使用 + – * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。这方面的程序很多,一般都是穷举求解。

基本原理

基本原理是穷举4个整数所有可能的表达式,然后对表达式求值。

表达式的定义: expression = (expression|number) operator (expression|number)

因为能使用的4种运算符 + – * / 都是2元运算符,所以本文中只考虑2元运算符。2元运算符接收两个参数,输出计算结果,输出的结果参与后续的计算。

#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");
}

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

C

#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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算24点

    游戏规则:一副牌中抽去大小王剩下52张,任意抽取4张牌,利用四则运算(加减乘除以及括号)把牌面上的数算成24。每张牌能且只能用一次。

    万木逢春
  • 【RAPID】程序计算点位(上)

    未完待续

    EdenChen
  • 【RAPID】程序计算点位(下)

    谢谢侬~

    EdenChen
  • (24) 异常 (上) / 计算机程序的思维逻辑

    之前我们介绍的基本类型、类、接口、枚举都是在表示和操作数据,操作的过程中可能有很多出错的情况,出错的原因可能是多方面的,有的是不可控的内部原因,比如内存不够了、...

    swiftma
  • 计算机为什么能够读懂程序代码?

    上一回,我们的主人公小A初次亮相,凭借基础的前后端理解,从技术实现的层面为我们剖析了微信扫码登录的几秒钟里,到底发生了什么。可能很多人因此会好奇,小A到底是做什...

    帅地
  • 2020-01-24:手写代码:快速排序。

    福大大架构师每日一题
  • 2021-04-24:手写代码:拓扑排序。

    [左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/cl...

    福大大架构师每日一题
  • 2021-04-24:手写代码:拓扑排序。

    福大大架构师每日一题
  • KDJ计算代码_Python代码

    import numpy as np def KDJ(date,N=9,M1=3,M2=3): datelen=len(date) arra...

    py3study
  • 程序算法|PHP、安卓、C++程序代码交流

    使用android studio的安卓开发者可能发现它和eclipse+ADT大同小异,个人用完android studio之后发现android studio...

    极客人
  • 小浩算法|一文让你学会如何用代码判断"24"点

    “24点”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所...

    宜信技术学院
  • 【程序源代码】代驾小程序

    链接:https://pan.baidu.com/s/17K_1otAk834qS5QofSOy_g

    程序源代码
  • 【程序源代码】python之经典算法

    今天这篇文章主要是介绍:现在随着人工智能、大数据的普及,越来越多计算机领域需要应用到算法以及数据结构。今天在网上看到一个python写的经典算法的事例,推荐给大...

    程序源代码
  • PHP代码审计要点

    随着代码安全的普及,越来越多的开发人员知道了如何防御sqli、xss等与语言无关的漏洞,但是对于和开发语言本身相关的一些漏洞和缺陷却知之甚少,于是这些点也就是我...

    HACK学习
  • 小程序中的小数计算问题/浮点数计算问题

    小程序是不支持在视图层写任何js的,包括过滤器filters等,推荐在渲染之前,将数据格式化,或者用wxs。

    Javanx
  • 计算器程序

    py3study
  • 自学鸿蒙应用开发(24)- 会计算的计算器(含源码)

    前面的文章介绍过如何使用鸿蒙布局功能构建一个计算器界面,本文是那篇文章的续集。使用作者以前学习安卓开发时写的一个计算器程序,后来出版《实战Python设计模式》...

    面向对象思考
  • (22) 代码的组织机制 / 计算机程序的思维逻辑

    使用任何语言进行编程都有一个类似的问题,那就是如何组织代码,具体来说,如何避免命名冲突?如何合理组织各种源文件?如何使用第三方库?各种代码和依赖库如何编译连接为...

    swiftma
  • php计数排序算法的实现代码(附四个实例代码)

    计数排序只适合使用在键的变化不大于元素总数的情况下。它通常用作另一种排序算法(基数排序)的子程序,这样可以有效地处理更大的键。

    砸漏

扫码关注云+社区

领取腾讯云代金券