C语言实现经典24点算法

C语言实现经典24点算法

什么是24点算法

24点算法是一种数学游戏,通过将四个数字进行加、减、乘、除的运算,得出结果为24的算法。例如,给出4个数字6、6、2、1,可以通过计算得到 $6/(1-2/6)=24$,满足24点算法的要求。

实现步骤

  1. 读入四个数字 a、b、c、d,存入数组 num[] 中。
  2. 枚举 num[] 中的每一个数字,将其作为算式的第一个数字,计算剩下的三个数的24点算式。
  3. 在剩下的三个数中,按照加减乘除的四种运算分别枚举两个数,计算得到结果,并将结果作为新的一项加入到剩下未处理的两个数中。
  4. 当剩下未处理的数字只剩下一个时,判断其是否等于24,如果是则输出整个算式,程序结束。

代码实现

以下是C语言实现24点算法的代码示例:

#include <stdio.h>

double num[4];

int dfs(int step) {
    if (step == 1) {
        if (fabs(num[0] - 24) < 1e-6 ) {
            printf("%.0lf", num[0]);
            return 1;
        }
        return 0;
    }
    for (int i = 0; i < step; i++) {
        for (int j = i + 1; j < step; j++) {
            double a = num[i], b = num[j];
            num[j] = num[step - 1];
            num[i] = a + b;
            if (dfs(step - 1)) {
               printf(" + ");
               printf("%.0lf", b);
               return 1;
            }
            num[i] = a - b;
            if (dfs(step - 1)) {
               printf(" - ");
               printf("%.0lf", b);
               return 1;
            }
            num[i] = b - a;
            if (dfs(step - 1)) {
               printf(" - ");
               printf("%.0lf", a);
               return 1;
            }
            num[i] = a * b;
            if (dfs(step - 1)) {
               printf(" * ");
               printf("%.0lf", b);
               return 1;
            }
            if (fabs(b) > 1e-6) {
                num[i] = a / b;
                if (dfs(step - 1)) {
                    printf(" / ");
                    printf("%.0lf", b);
                    return 1;
                }
            }
            if (fabs(a) > 1e-6) {
                num[i] = b / a;
                if (dfs(step -1)) {
                    printf(" / ");
                    printf("%.0lf", a);
                    return 1;
                }
            }
            num[i] = a;
            num[j] = b;
        }
    }
    return 0;
}

int main() {
    for (int i = 0; i < 4; i++) scanf("%lf", &num[i]);
    if (!dfs(4)) printf("no sulution.\n");
    return 0;
}

以上代码实现了一个递归的深度遍历算法,至多用时4! * 6 ^ 3次,时间复杂度为O($n^6$)。

示例说明

下面给出两组输入和输出例子,以说明程序的使用方法和输出结果:

示例1

输入:6 6 3 4

输出:$(6 + 6) * (4 - 3) = 24$

程序先将4个数读入并存入num[]数组中,然后先将两个6相加得到12,剩下{12, 3, 4},接着将12和4做乘法得到48,剩下{48, 3},最后将48加上3得到51,与24不相等,程序输出“no solution”。

示例2

输入:2 5 6 8

输出:$((6/2)5)8 = 240$

程序同样先将4个数读入并存入num[]数组中,然后先将6和2做除法得到3,再将3和5做乘法得到15,剩下{15,8}。接着将15和8做乘法得到120,剩下{120},最后120和8做乘法得到240,与24相等,程序输出“((6/2)5)8 = 240”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现经典24点算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++游戏编程之模拟实现键盘打字程序

    C++游戏编程之模拟实现键盘打字程序 简介 键盘打字游戏是目前非常流行的游戏之一。本文将介绍如何使用C++编写一个小型的键盘打字游戏,用于锻炼玩家的打字能力。本文将通过模拟实现的方式来介绍如何编写这个小型游戏程序。 过程 1.首先,我们需要设计游戏界面。游戏界面应该包括一个文本框、一个文本输入框和一个“开始”按钮。用户需要在文本输入框中输入键盘上的单词,按下…

    C 2023年5月23日
    00
  • Linux中文件系统truncate.c详解

    Linux中文件系统truncate.c详解 什么是truncate.c文件 truncate.c文件是Linux内核中负责处理文件截断操作的核心文件。其主要功能是截断指定文件的长度,可以对文件进行缩短或扩展。在Linux系统的文件系统中,文件截断操作是文件的常用操作之一。 truncate.c文件操作示例 1. 文件截断操作 truncate.c文件主要包…

    C 2023年5月24日
    00
  • C语言实现二叉树的基本操作

    C语言实现二叉树的基本操作 一、概述 二叉树是一种经典的数据结构,它是由若干个节点构成的树形结构,每个节点最多有两个子节点(左子节点和右子节点)。在C语言中,二叉树的实现可以使用结构体和指针来完成。本文将详细介绍如何实现二叉树的基本操作。 二、数据结构 二叉树的数据结构可以使用以下结构体来定义: typedef struct TreeNode { int d…

    C 2023年5月23日
    00
  • C++ 动态内存管理详情解说

    C++ 动态内存管理详情解说 在 C++ 程序中,动态内存管理是一项非常重要的任务。动态内存分配和释放可以在运行时动态地完成,使程序具有更大的灵活性。本文将详细解释动态内存管理的概念以及它的使用方法。 什么是动态内存? 动态内存是指程序在运行时动态地分配的内存。每个程序都有一个静态内存,该内存是编译时分配的。静态内存的大小是固定的,而动态内存的大小不是固定的…

    C 2023年5月22日
    00
  • Ubuntu环境下使用G++编译CPP文件

    以下是Ubuntu环境下使用G++编译CPP文件的完整攻略: 安装G++ 在Ubuntu环境下使用G++编译C++文件,首先需要安装G++编译器。可以通过以下命令进行安装: sudo apt-get update sudo apt-get install g++ 编写C++文件 在安装好G++编译器之后,可以使用任何文本编辑器编写需要编译的C++文件。例如,…

    C 2023年5月23日
    00
  • C++超详细讲解内存空间分配与this指针

    C++超详细讲解内存空间分配与this指针攻略 基本介绍 本攻略主要针对C++中的内存空间分配和this指针进行详细讲解。 在C++中,内存空间分配是非常重要的一个话题,因为它涉及到了对象的存储和访问问题。而this指针则是在对象内部指向自身的指针,它在程序中经常用到。 内存空间分配 在C++中,对象的存储分为两部分:栈内存和堆内存。 栈内存 栈内存是编译器…

    C 2023年5月22日
    00
  • Win10怎么设置MTU值加快WIFI速度?

    针对“Win10怎么设置MTU值加快WIFI速度?”这个问题,下面是我提供的完整攻略: 1. 了解MTU值 MTU(Maximum Transmission Unit)即最大传输单元,是每个数据包可以传输的最大数据量。通常情况下,MTU值越大,一个数据包就可以携带更多的数据,从而提高网络传输效率。但如果MTU值设置得过大,会增加传输过程中出现网络问题的风险。…

    C 2023年5月22日
    00
  • c#多线程通信之委托事件

    本文介绍C#多线程通信之委托事件,主要包括以下几个部分: 委托和事件机制简介 C#多线程通信的方法 委托事件的使用示例 总结 1. 委托和事件机制简介 委托是一种类型,用于存储对某个方法的引用,可用于异步编程、事件处理、回调函数等场景。事件是一种机制,事件可以成为委托的订阅者,并在委托的调用过程中被自动调用。 使用委托和事件机制时,需要定义委托类型和事件类型…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部