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
  • C++实现三子棋游戏详细介绍(附代码)

    C++实现三子棋游戏详细介绍(附代码) 简介 本文将介绍如何使用C++语言来实现一个简单的三子棋游戏。三子棋游戏是一种经典的小游戏,规则简单玩法有趣。在这个游戏中,两个玩家将轮流在一个3×3的棋盘上放置自己的棋子,若某个玩家在横、竖、斜三个方向上连续地放置了三个自己的棋子,则该玩家获胜。本文的实现将包括游戏引擎和用户界面,读者可以直接运行实现好的程序进行游戏…

    C 2023年5月24日
    00
  • PHP如何抛出异常处理错误

    异常处理是在程序运行时检测到错误时的一种标准处理方式。PHP 使用 try/catch 语句块来实现异常处理。 1. 抛出异常 PHP 中可以使用 throw 关键字抛出一个异常。 throw new Exception(‘这是一个异常信息’); 以上代码会抛出一个 Exception 类型的异常,并且在异常对象中保存了一个字符串“这是一个异常信息”。 2.…

    C 2023年5月23日
    00
  • C语言进阶教程之预处理

    下面是“C语言进阶教程之预处理”的完整攻略: 什么是预处理? 预处理是指在编译的过程中,在真正的编译之前,对源代码进行的一些文本替换和宏展开等操作。预处理在编写代码过程中很重要,可以提高代码的可读性和效率。 预处理指令 在C语言中,预处理指令都是以 # 符号开头,例如 #include 和 #define 等指令。 常用的预处理指令包括: include:用…

    C 2023年5月23日
    00
  • C++回溯算法之深度优先搜索详细介绍

    C++回溯算法之深度优先搜索详细介绍 什么是深度优先搜索 深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。在深度优先搜索中,我们按深度优先顺序访问每个节点,尽可能深地探索每个节点的分支,直到达到最深处,然后返回到该节点的上一级分支。 深度优先搜索的算法框架 深度优先搜索的算法框架可以表示成以下伪代码: dfs(node) { if (node is …

    C 2023年5月22日
    00
  • C语言使用函数指针

    C语言中,函数指针是指向函数的指针变量。使用函数指针可以让程序具有更高的灵活性和可扩展性,能够更好地适应不同的需求。 1. 声明函数指针 声明函数指针的语法如下: 返回类型 (*指针变量名)(参数列表); 例如: int (*myFunc)(int a, int b); 上述代码中,声明了一个名为 myFunc 的指向返回类型为 int,参数列表为 (int…

    C 2023年5月9日
    00
  • 企业官网怎么做 5大设计要点教你搭建好看又好卖的企业产品官网

    下面是讲解“企业官网怎么做 5大设计要点教你搭建好看又好卖的企业产品官网”的完整攻略。 1. 设计风格 企业官网的设计风格应当符合企业的品牌形象与企业文化,传达出企业的特点与业务重点。因此,设计风格应当与企业的行业和定位相符合,同时重视用户体验,为用户提供方便快捷的浏览体验。 2. 导航设计 导航设计要符合网站用户习惯,以用户体验为导向,使用户可以轻松找到所…

    C 2023年5月23日
    00
  • C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南 C语言作为一门编程语言,具有严谨、简洁、高效的特点。为了使得代码易于维护、易于理解、易于扩展,需要遵守一些语法风格与代码书写规范。 命名规范 变量名、函数名等采用小写字母加下划线的方式,如:user_id 宏定义采用全部大写的方式,如:#define MAX_NUM 100 结构体名、枚举类型名首字母大写,采用驼峰命名法,…

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