C++计算24点的简单程序

下面我会详细讲解如何编写一个使用C++语言计算24点的简单程序,攻略分为以下几个步骤:

1. 程序说明

计算24点是一个纸牌游戏,游戏规则如下:

  • 从一副牌中随机选择4张牌,可以是任意花色和面值;
  • 利用加、减、乘、除等基本运算,以及括号等数学符号,计算出24。

例如,给定四张牌5、5、3、2,可以通过以下算式计算出24:

(5 + 5) * 3 - 2 = 24

2. 程序设计

我们可以使用递归函数,将所有可能的操作算出来,并判断是否满足24点计算规则。

2.1 定义递归函数

我们定义一个递归函数calculate(),输入一个数组nums和一个整数n,其中nums表示当前可用的数字,n表示nums中剩余数字的个数。函数返回是否能够计算出24。

bool calculate(double* nums, int n);

2.2 递归终止条件

当数组nums中只剩下一个数字时,这个数字必须为24,否则无法计算出24点。

当数组nums为空时,返回false,表示无法计算出24点。

2.3 递归计算

我们从数组nums中任选两个数字,进行加、减、乘、除等运算,计算出一个新的数字,将新数字和剩余数字放入一个新的数组中,递归调用calculate()函数。如果递归函数返回true,则直接返回true,否则继续进行运算。

2.4 实现细节

需要注意的是,除法运算中要判断除数是否为0,如果为0直接返回false。

代码如下所示:

bool calculate(double* nums, int n) {
    if (n == 1) {
        return abs(nums[0] - 24) < 0.0001;    // 判断是否等于24
    }
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            double newNums[4];
            int index = 0;
            for (int k = 0; k < n; k++) {
                if (k != i && k != j) {
                    newNums[index++] = nums[k];
                }
            }
            newNums[index] = nums[i] + nums[j];
            if (calculate(newNums, n - 1)) {
                return true;
            }
            newNums[index] = nums[i] - nums[j];
            if (calculate(newNums, n - 1)) {
                return true;
            }
            newNums[index] = nums[j] - nums[i];
            if (calculate(newNums, n - 1)) {
                return true;
            }
            newNums[index] = nums[i] * nums[j];
            if (calculate(newNums, n - 1)) {
                return true;
            }
            if (nums[j] != 0) {    // 判断除数是否为0
                newNums[index] = nums[i] / nums[j];
                if (calculate(newNums, n - 1)) {
                    return true;
                }
            }
            if (nums[i] != 0) {    // 判断除数是否为0
                newNums[index] = nums[j] / nums[i];
                if (calculate(newNums, n - 1)) {
                    return true;
                }
            }
        }
    }
    return false;
}

3. 程序示例

下面给出两个计算24点的示例:

3.1 示例1

假设4张牌的面值为3、8、1、2,计算过程如下:

  • (3 + 8) * (1 + 2) = 33
  • (3 * 8) - (1 + 2) = 21
  • (3 - 1) * (2 + 8) = 20
  • (1 + 8) * (3 + 2) = 55
  • (2 - 1) * (3 * 8) = 24

可以发现,通过递归计算,程序正确地计算出了24。

3.2 示例2

假设4张牌的面值为1、3、4、6,计算过程如下:

  • (1 + 4) * (3 + 6) = 45
  • (6 - 4) * (1 + 3) = 8
  • (3 * 6) - (1 + 4) = 13
  • (4 * 6) / (3 - 1) = 12
  • (3 + 6) + (4 + 1) = 14
  • (6 - 3) * (4 + 1) = 15
  • (3 + 1) * (6 - 4) = 8
  • (6 - 3) + (4 * 1) = 7
  • (4 - 1) * (6 - 3) = 9
  • (6 - 1) - (4 / 3) = 3

可以发现,通过递归计算,程序正确地计算出了24。

4. 总结

通过本文的介绍,我们了解了如何使用C++语言编写一个计算24点的简单程序,包括程序说明、程序设计、程序示例等方面的内容。希望这篇攻略对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++计算24点的简单程序 - Python技术站

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

相关文章

  • C语言传递函数指针

    我们来详细讲解一下C语言中传递函数指针的完整使用攻略。 什么是C语言函数指针? 在C语言中,函数指针是指向函数的指针变量。由于函数本身在内存中也有一个地址,因此可以用指针来指向一个函数。 函数指针的声明格式如下: typedef 返回值类型 (*函数名)(参数类型1, 参数类型2, …); 其中,typedef是用来定义类型别名的关键字,返回值类型是指被…

    C 2023年5月9日
    00
  • C语言实现求最大公约数的三种方法

    C语言实现求最大公约数的三种方法 最大公约数是指两个或多个整数共有约数中的最大值。下面我们将介绍 C 语言实现求最大公约数的三种方法。 1.辗转相减法 辗转相减法的基本思想是用大数减去小数,然后再用得出的差值去减小的数,这样一直操作,直到所减两数相等。 代码如下: int gcd(int x, int y) { while(x != y) { if(x &g…

    C 2023年5月22日
    00
  • Win8开机出现致命错误C00000022怎么办 解决方法介绍

    Win8开机出现致命错误C00000022解决方法 如果你在Win8系统开机时遇到了致命错误C00000022,可能是由于系统文件受损或系统不兼容等问题引起的。此时需要采取一些措施来解决该问题。在本文中,我们将介绍几种可行的解决方法。 方法一:使用恢复模式修复启动 在电脑启动时按下F8键进入高级选项菜单。 选择“恢复模式”并按Enter键进入。 选择“命令提…

    C 2023年5月23日
    00
  • 如何在imToken钱包使用cBridge跨链桥?cBridge资产跨链操作步骤教程

    下面是关于如何在imToken钱包使用cBridge跨链桥的攻略,包含cBridge资产跨链操作的步骤教程。 cBridge 背景介绍 cBridge 是一个去中心化的跨链解决方案,它可以实现在不同区块链之间进行数字资产的无缝转移和交易。目前支持的区块链包括以太坊、波卡、云图等等,同时还支持多种数字资产的跨链交易。 如何在 imToken 使用 cBridg…

    C 2023年5月23日
    00
  • C语言中如何进行指针操作?

    C语言中指针操作非常重要,通过指针可以直接操作内存,能够帮助我们更好地利用计算机资源。下面我将详细讲解C语言中指针操作的方法。 一、定义指针(声明和初始化) 在C语言中,声明指针使用*,例如: int *p; 指针定义完成后,需要为其赋值,使其指向一个具有内存地址的变量,例如: int a = 1; int *p = &a; 说明:&符号表示…

    C 2023年4月27日
    00
  • Excel怎么制作每月的房贷车贷提前还贷计算器?

    制作每月的房贷车贷提前还贷计算器的完整攻略如下: 步骤一:新建 Excel 工作表 首先,打开 Excel 软件并新建工作表。可以直接使用 Excel 自带的模板,也可以自己设计一个。 步骤二:设置表头 在工作表的第一行,设置表头信息,包含如下内容: 月份 剩余本金 当期应还本金 当期应还利息 当期总还款额 提前还款金额 提前还款本金 提前还款后剩余本金 本…

    C 2023年5月22日
    00
  • Java如何自定义异常打印非堆栈信息详解

    如何自定义异常打印非堆栈信息 在Java程序中,当代码抛出异常时,异常信息中除了常见的堆栈信息(stack trace)外,还可以自定义异常信息和错误代码等非堆栈信息。这种自定义异常信息可以更加清晰地描述异常情况,便于程序员快速定位和排查问题。下面是一种标准的Java自定义异常的方式,结合代码实例进行说明。 自定义异常示例 在Java中,我们可以通过继承Ex…

    C 2023年5月23日
    00
  • C语言实现简易学生成绩管理系统

    C语言实现简易学生成绩管理系统攻略 系统需求 我们需要实现一个简单的学生成绩管理系统,满足以下需求: 学生姓名、学号、性别等基本信息的录入和管理; 课程成绩的录入和查询,包括成绩的增删改查功能; 可以根据学号、姓名、分数等条件进行查询排序; 可以将学生成绩信息保存在文件中。 实现步骤 设计数据结构 我们需要先设计数据结构,才能进行后续工作。根据上述需求,这里…

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