C++ 枚举算法教程

📌 适用人群: 无编程基础或刚接触C++的新手
🧠 目标: 理解枚举算法的基本概念与应用场景,并能用C++实现简单问题。
💡 知识点预览:

  • 什么是枚举算法?
  • 如何编写枚举算法?
  • 枚举的优缺点
  • 实例讲解(数字密码破解、百鸡问题等)
  • 使用 using namespace std; 简化代码

🔹 一、什么是枚举算法?

📘 定义:

枚举算法(Brute Force / Exhaustive Search)是一种最直接的问题解决方法,它的核心思想是:

“把所有可能的情况都列出来,逐一尝试,找到符合条件的答案。”

✅ 特点:

  • 直观易懂:适合新手理解。
  • 无需复杂逻辑:只要能列出所有情况即可。
  • 效率较低:当数据量大时会非常慢。

🔹 二、枚举算法的步骤

  1. 确定枚举对象:找出要穷举的内容。
  2. 设置循环结构:使用 forwhile 遍历所有可能值。
  3. 添加判断条件:筛选出满足题意的结果。
  4. 输出结果:打印或返回答案。

🔹 三、C++ 中的枚举算法示例

🎯 示例 1:猜三位数密码

假设你知道一个三位数密码是由 0~9 组成的,但不知道具体数字,我们来尝试暴力破解。

#include <iostream>
using namespace std;

int main() {
    for (int i = 0; i <= 9; ++i) {     // 百位
        for (int j = 0; j <= 9; ++j) { // 十位
            for (int k = 0; k <= 9; ++k) { // 个位
                cout << "尝试密码: " << i << j << k << endl;
            }
        }
    }
    return 0;
}

🧩 输出:

尝试密码: 000
尝试密码: 001
...
尝试密码: 999

🎯 示例 2:百钱买百鸡问题

🐔 题目描述:
公鸡5元一只,母鸡3元一只,小鸡1元3只。用100元刚好买100只鸡,问公鸡、母鸡、小鸡各多少只?

#include <iostream>
using namespace std;

int main() {
    int count = 0;
    cout << "百钱买百鸡的解法如下:" << endl;
    for (int x = 0; x <= 100 / 5; ++x) {      // 公鸡最多20只
        for (int y = 0; y <= 100 / 3; ++y) {  // 母鸡最多33只
            int z = 100 - x - y;              // 小鸡数量
            if (z % 3 == 0 && 5*x + 3*y + z/3 == 100) {
                cout << "公鸡:" << x << ",母鸡:" << y << ",小鸡:" << z << endl;
                count++;
            }
        }
    }
    cout << "共有 " << count << " 种解法" << endl;
    return 0;
}

🧪 输出示例:

公鸡:0,母鸡:25,小鸡:75
公鸡:4,母鸡:18,小鸡:78
...
共有 4 种解法

🔹 四、枚举算法的优缺点

优点 缺点
✅ 思路清晰,易于理解和实现 ❌ 效率低,尤其是大规模数据时
✅ 不需要复杂的数据结构或数学知识 ❌ 可能会重复计算
✅ 适用于小规模问题或验证其他算法 ❌ 不适合高性能要求场景

🔹 五、小技巧 & 注意事项

  • 减少枚举范围:比如在百鸡问题中限制了公鸡和母鸡的数量上限。
  • 避免无效组合:通过提前判断跳过不可能的情况。
  • 合理嵌套循环:不要过度嵌套,否则代码难以维护。

🔹 六、总结

📌 枚举算法是一种“暴力求解”的方法,适合初学者练习逻辑思维和循环控制。

🎯 虽然效率不高,但在以下情况下很有用:

  • 数据量不大
  • 没有更高效的方法
  • 用于验证其他算法的正确性

📘 建议多做练习题巩固理解!


🔹 七、课后练习题推荐

题目名称 描述
找因数 输入一个整数 n,输出它所有的因数
水仙花数 找出 100 到 999 之间的所有水仙花数(各位立方和等于该数本身)
密码生成器 生成所有长度为3的字母+数字组合密码
数字排列 从1~9中任选三个不重复的数字组成三位数

🧩 结语

🎉 枚举算法是你学习编程的第一步,虽然不是最快的,但它是最诚实的方式。
当你掌握了枚举算法,就可以开始挑战更高效的算法啦,比如回溯法、贪心算法、动态规划等等!

📢 加油!你正在成为编程高手的路上!🚀


如果你喜欢这份教程,欢迎收藏、转发或留言告诉我你想学什么内容 😊

14 条评论

  • @ 2025-6-1 11:52:51

    • @ 2025-6-1 11:48:10
      #include<iostream>
      #include<iomanip>
      //保留几位小数工具:<<fixed<<setprecision(3)
      //#include <iomanip>//专门用于输出格式化的工具箱
      //setw()设置输出宽度
      using namespace std;
      int main() {
      	//setw()会设置输出宽度 在宽度范围内默认右对齐前面留空格
      	//setfill()设置填充字符  默认填充字符空格
      	//在宽度范围内默认右对齐默认右对齐 right
      	//左对齐 left
      	for(int i=0;i<=999;i++){
      		cout<<setw(3)<<setfill('0')<<left<<i<<endl;
      	}
      	return 0;	
      }
      
      • @ 2025-6-1 11:40:29
        #include<iostream>
        #include<iomanip>
        //保留几位小数工具:<<fixed<<setprecision(3)
        //#include <iomanip>//专门用于输出格式化的工具箱
        //setw()设置输出宽度
        using namespace std;
        int main() {
        	//setw()会设置输出宽度 在宽度范围内默认右对齐前面留空格
        	//setfill()设置填充字符  默认填充字符空格
        	for(int i=0;i<=999;i++){
        		cout<<setw(3)<<setfill('0')<<i<<endl;
        	}
        	return 0;
        }
        
        • @ 2025-5-19 22:07:57

          🧮 C++ 枚举算法教程(零基础版)

          从0开始掌握枚举法,附完整示例代码 + 图解风格 + 生动解释


          🔍 什么是枚举算法?

          枚举算法(Enumeration Algorithm) 是一种最直接、最基础的解决问题的方法。

          基本思想:把所有可能的情况都列出来,逐一检查,找出符合条件的解。

          它也被称为“穷举法”。


          ⚙️ 枚举算法的核心思想

          1. 列出所有可能的候选解
          2. 对每个候选解进行判断
          3. 保留满足条件的解

          类似于“大海捞针”——你不知道答案在哪里,就一个一个试!


          📦 枚举算法的基本模板

          for (遍历所有可能情况) {
              if (当前情况满足条件)
                  记录或输出结果;
          }
          

          🎨 枚举算法流程图(伪代码风格)

          开始
          │
          ├─→ 初始化变量
          │
          ├─→ 枚举每一种可能情况
          │
          ├─→ 对每种情况做判断
          │
          ├─→ 如果满足条件 → 输出或记录
          │
          └─→ 结束,输出结果
          

          🧠 枚举算法优缺点总结

          特点 说明
          ✅ 简单直观 容易理解和实现
          ❌ 效率低 当数据量大时会非常慢
          ✅ 适用于小规模问题 如数学题、小游戏、密码尝试等
          ❌ 不适合大规模搜索 应该考虑优化或剪枝策略

          🧪 枚举算法优化技巧

          技巧 说明
          🚫 剪枝 提前排除不可能的情况,减少无效枚举
          🔁 合理设置循环范围 减少不必要的遍历
          🧠 加入条件判断 快速跳过不符合条件的情况
          📊 分治思想 将大问题拆成多个小问题分别枚举


          📌 结语:
          枚举算法是算法入门的第一步,虽然看起来简单,但它是很多高级算法的基础。通过本教程,你应该已经掌握了它的基本思想和使用方法!

          需要配套练习题或进阶讲解也可以随时告诉我哦 😊

          • @ 2025-5-18 12:26:44
            #include<iostream>
            using namespace std;
            int main() {
            	int n;
            	cin >> n;
            	int s = 0; 
            	double avg;
            	for(int i=1;i<=n;i++){
            		int a;
            		cin>>a;
            		s += a;
            	}
            	cout<<s<<endl;
            	avg = (double)s/n;//avg = 1.0*s/n;
            	cout<<avg<<endl;
            	return 0;
            }
            
            • @ 2025-5-18 11:10:43

              #include<iostream>
              using namespace std;
              int main() {
              	int n;
              	cin >> n;
              	int s = 0;
              	double avg;
              	for(int i=1;i<=n;i++){
              		int a;
              		cin>>a;
              		s += a;
              	}
              	cout<<s<<endl;
              	avg = (double)s/n;//avg = 1.0*s/n;
              	cout<<avg<<endl;
              	return 0;
              }
              
              • @ 2025-5-18 11:07:27

                #include<iostream>
                using namespace std;
                int main() {
                	int n;
                	cin >> n;
                	int s = 0;
                	for(int i=1;i<=n;i++){
                		int a;
                		cin>>a;
                		s += a;
                	}
                	cout<<s;
                	return 0;
                }
                
                • @ 2025-5-18 11:01:58
                  #include<iostream>
                  using namespace std;
                  int main() {
                  	int n;
                  	cin >> n;
                  	int Min = INT_MAX;//创建一个存放最小大值的变量  初始化非常大的值
                  	//假设Min是最大的
                  	for(int i=1;i<=n;i++){//打擂台一个思想
                  		int a;//a属于[0,100]
                  		cin>>a;//接受数据
                  		if(a <= Min){//如果数据比Min小
                  			Min = a;//就更新一下,保证Min是最消的
                  		}
                  	}
                  	cout<<Min;
                  	return 0;
                  }
                  
                  • @ 2025-5-18 10:59:21
                    #include<iostream>
                    #include<limits.h>
                    using namespace std;
                    int main() {
                    	cout<<INT_MIN<<endl;//-2147483648
                    	cout<<INT_MAX<<endl;//2147483647
                    	return 0;
                    }
                    
                    • @ 2025-5-18 10:54:15

                      • @ 2025-5-18 10:50:55
                        #include<iostream>
                        using namespace std;
                        int main() {
                        	int n;
                        	cin >> n;
                        	int Min = 200;//创建一个存放最小大值的变量  初始化非常大的值
                        	//假设Min是最大的
                        	for(int i=1;i<=n;i++){//打擂台一个思想
                        		int a;//a属于[0,100]
                        		cin>>a;//接受数据
                        		if(a <= Min){//如果数据比Min小
                        			Min = a;//就更新一下,保证Min是最消的
                        		}
                        	}
                        	cout<<Min;
                        	return 0;
                        }
                        
                        • @ 2025-5-18 10:48:32
                          #include<iostream>
                          using namespace std;
                          int main() {
                          	int n;
                          	cin >> n;
                          	int a;
                          	cin>>a;//a属于[0,100]
                          	int Max = a;//创建一个存放最大值的变量
                          	//假设Max是最大的
                          	for(int i=2;i<=n;i++){//打擂台一个思想
                          		cin>>a;//接受数据
                          		if(a >= Max){//如果数据比Max大
                          			Max = a;//就更新一下,保证max是最大的
                          		}
                          	}
                          	cout<<Max;
                          	return 0;
                          }
                          
                          • @ 2025-5-18 10:48:21
                            #include<iostream>
                            using namespace std;
                            int main() {
                            	int n;
                            	cin >> n;
                            	int Max = -1;//创建一个存放最大值的变量
                            	//假设Max是最大的
                            	for(int i=1;i<=n;i++){//打擂台一个思想
                            		int a;//a属于[0,100]
                            		cin>>a;//接受数据
                            		if(a >= Max){//如果数据比Max大
                            			Max = a;//就更新一下,保证max是最大的
                            		}
                            	}
                            	cout<<Max;
                            	return 0;
                            }
                            
                            • @ 2025-5-18 10:47:59

                              🌟 C++ 枚举算法教程🌟

                              适合初学者的枚举算法讲解,图文并茂、通俗易懂!


                              🔍 什么是枚举算法?

                              枚举算法(Brute Force / Exhaustive Search) 是一种最直观、最基本的解决问题的方法。它的核心思想是:

                              把所有可能的情况都列出来,逐一尝试,找出符合条件的解。

                              虽然效率不高,但在数据规模较小时非常实用,而且逻辑清晰,非常适合新手学习!


                              🧠 枚举的基本思路

                              1. 确定枚举对象和范围
                              2. 编写循环结构遍历所有可能值
                              3. 在循环中加入条件判断,筛选出满足条件的结果

                              📚 使用前提

                              • 数据量不能太大(否则会超时)
                              • 没有更高效的算法可用
                              • 算法逻辑简单,容易实现

                              🛠️ C++代码模板(使用 using namespace std;

                              我们先来看一个通用的枚举算法框架:

                              #include <iostream>
                              using namespace std;
                              
                              int main() {
                                  // 声明变量
                                  int n; // 枚举上限
                                  cout << "请输入枚举范围上限:";
                                  cin >> n;
                              
                                  // 枚举循环
                                  for (int i = 1; i <= n; ++i) {
                                      if (/* 条件判断 */) {
                                          // 符合条件的操作
                                          cout << "找到符合条件的值:" << i << endl;
                                      }
                                  }
                              
                                  return 0;
                              }
                              

                              🧪 实战案例一:找出1~100之间的所有偶数 ✅

                              💡 思路分析:

                              我们要从1到100中,找出能被2整除的数字。

                              #include <iostream>
                              using namespace std;
                              
                              int main() {
                                  for (int i = 1; i <= 100; ++i) {
                                      if (i % 2 == 0) {
                                          cout << i << " ";
                                      }
                                  }
                                  cout << endl;
                                  return 0;
                              }
                              

                              ✅ 输出结果:

                              2 4 6 8 ... 100
                              

                              🧪 实战案例二:百钱买百鸡问题 🐔💰

                              公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?

                              💡 分析思路:

                              设公鸡为x只,母鸡y只,小鸡z只:

                              • x + y + z = 100 (总数量)
                              • 5x + 3y + z/3 = 100 (总金额)

                              注意:z必须是3的倍数。

                              #include <iostream>
                              using namespace std;
                              
                              int main() {
                                  for (int x = 0; x <= 20; ++x) {         // 公鸡最多20只(100/5)
                                      for (int y = 0; y <= 33; ++y) {     // 母鸡最多33只(100/3)
                                          int z = 100 - x - y;
                                          if (z % 3 == 0 && 5*x + 3*y + z/3 == 100) {
                                              cout << "公鸡:" << x << ",母鸡:" << y << ",小鸡:" << z << endl;
                                          }
                                      }
                                  }
                                  return 0;
                              }
                              

                              ✅ 部分输出示例:

                              公鸡:0,母鸡:25,小鸡:75
                              公鸡:4,母鸡:18,小鸡:78
                              ...
                              

                              🧪 实战案例三:水仙花数(Narcissistic Number)🌊

                              水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153 = 1³ + 5³ + 3³

                              #include <iostream>
                              using namespace std;
                              
                              int main() {
                                  for (int i = 100; i <= 999; ++i) {
                                      int a = i / 100;       // 百位
                                      int b = (i / 10) % 10; // 十位
                                      int c = i % 10;        // 个位
                                      if (a*a*a + b*b*b + c*c*c == i) {
                                          cout << i << " 是水仙花数" << endl;
                                      }
                                  }
                                  return 0;
                              }
                              

                              ✅ 输出:

                              153 是水仙花数
                              370 是水仙花数
                              371 是水仙花数
                              407 是水仙花数
                              

                              🎯 小技巧 & 注意事项 ✅

                              技巧 说明
                              🔁 循环嵌套不要太深 超过3层就考虑优化或剪枝
                              ❌ 避免无意义枚举 提前加条件限制范围
                              ⏱️ 控制数据规模 枚举适合n≤1000的小数据

                              🧩 进阶思考题(练练手吧!)

                              1. 找出1000以内的完数(完数=因数之和等于它自己)
                              2. 找出所有的“回文数”(正着读反着读一样的数字)
                              3. 用枚举解决“鸡兔同笼”问题

                              📌 总结

                              特点 内容
                              ✅ 易于理解 逻辑清晰,适合新手
                              ❌ 效率低 不适合大数据
                              🔄 多重循环 可解决组合类问题
                              🧠 适合练习 培养编程思维和调试能力

                              🎉 结语

                              🎉 枚举算法就像是一把钥匙,虽然笨重但可以打开很多门。掌握了枚举,你就已经迈出了算法世界的第一步!

                              继续加油,未来的程序员大佬 👨‍💻✨


                              如果你喜欢这个风格,我还可以为你生成更多C++算法系列文章哦!需要的话请告诉我 😄

                              • 1