详细实例说明+典型案例实现 对枚举法进行全面分析 | C++

简介: 简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。

前言


       简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。

一、枚举法是什么?


1.简要介绍  

      枚举法又被称为穷举法、暴力法,是一种常见的数学方法。也是经常被使用的一种算法,它的核心思想:将问题所有的可能性列举出来,再根据具体问题的要求去逐一列举解答。或者为了去便于解决问题,进而将问题分为不重复,不遗漏的多种情况,对其进行逐一解决从而最终达到解决整个问题的目的。该方法的缺点就是速度慢,在程序中的执行效率低,但一般情况下该方法下的结果比较准确。

2.代码及结果示例(简单理解)

       ①将A、B两个子字符串连接起来,就是将B字符串的每一个字符从第一个字符开始逐步连接到A字符串的最后一个字符,如下图所示:


 

#include<iostream>
using namespace std;
class meiju {
public:
  void connect()
  {
    int record = 0;   //记录下标
    for (int count = 0; strA[count] != '\0'; count++)
    {
      record++;
    }
    for (int count = 0; strB[count] != '\0'; count++, record++)
    {
      strA[record] = strB[count];
    }
    cout << "合并后的字符串A:";
    for (int i = 0; i < record; i++)
    {
      cout << strA[i];
    }
  }
  char strA[20];
  char strB[10];
};
void text()
{
  meiju mj;
  cout << "输入字符串A:";
  cin >> mj.strA;
  cout << "输入字符串B:";
  cin >> mj.strB;
  mj.connect();
}
int main()
{
  text();
}

       ②将1000依次减去1,2,3,...,直到运算到哪一个数时,相减的结果开始出现负数。

#include<iostream>
using namespace std;
void text()
{
  int sum = 1000,i;
  for (i = 1; sum > 0; i++)
  {
    sum -= i;
  }
  cout << i-1 << endl;
}
int main()
{
  text();
}

3.生活实例

   有一天老师给同学们出了一个有趣的问题,把3个相同的小球放入A,B,C三个盒子中,请问共有多少种不同的放法。这时就用到了枚举法去对该问题进行列举分类,可以将其分为三类:

①三个球放在一起 ②二个球放在一起 ③ 单独一个球放在一起,具体情况如下图所示:

第一类

第二类 

二、枚举法的典型案例——鸡兔同笼&质数求解


1.鸡兔同笼

①具体情况:

       鸡兔同笼,是中国古代著名典型趣题之一,大约在1500年前,《孙子算经》中就记载了这个有趣的问题。在生活中,它是一个简单的数学问题。但在程序代码中我们如何该去实现它,它会用到哪些方面的算法思想是值得我们去思考学习的。

②代码实现(C++):

   输入头和脚总数目,用程序代码去计算出鸡和兔分别各有多少只。

#include<iostream>
using namespace std;
class meiju {
public:
  void func()
  {
  //i表示鸡 j表示兔
  for (int i = 0; i <= head; i++)
  {
    int j = head - i;
    if (i * 2 + j * 4 == foot)
    {
    chicken = i;
    rabbit = j;
    }
  }
  cout << "鸡的数目:" << chicken << endl;
  cout << "兔子的数目:" << rabbit << endl;
  }
  int chicken;
  int rabbit;
  int head;
  int foot;
};
void text()
{
  meiju mj;
  cout << "请输入头的总数量:" ;
  cin >> mj.head;
  cout << "请输入脚的总数量:" ;
  cin >> mj.foot;
  mj.func();
}
int main()
{
  text();
}

③ 结果展示:


2.质数求解(枚举法)

①具体情况:

    质数就是大于1并且除了自身外无法被其他整数整除的数,如2、3、5、7、11、13等等。在求质数的过程中,可以适当的运用一些技巧以减少循环检查的次数,从而剪断时间,提高代码执行效率。

②代码实现(C++):

输入一个数,判断该数是不是质数。

#include<iostream>
#include<cmath>
using namespace std;
class prime {
public:
  void isprime()
  {
  int i = 2,record=0;
  while (i <= sqrt(n))
  {
    if (n % i == 0)
    record = 1;
    i++;
  }
  if(record==1)
    cout << "该数不是质数" << endl;
  else
    cout << "该数是质数" << endl;
  }
  int n;
};
void text()
{
  prime p;
  cout << "请输入除1以外的数:";
  cin >> p.n;
  p.isprime();
}
int main()
{
  text();
}

③ 结果展示:

总结


       以上就是我们对枚举法的所有总结,由于该算法比较简单,所以我们不对其做过多的总结。


目录
相关文章
|
2月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
51 2
|
6天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
1月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
33 19
|
30天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
37 3
|
2月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
42 3
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
19 0
|
4月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
70 11
|
4天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
22 4