- C++
C++ 枚举算法教程
- 2025-5-18 10:41:45 @
C++ 枚举算法教程
📌 适用人群: 无编程基础或刚接触C++的新手
🧠 目标: 理解枚举算法的基本概念与应用场景,并能用C++实现简单问题。
💡 知识点预览:
- 什么是枚举算法?
- 如何编写枚举算法?
- 枚举的优缺点
- 实例讲解(数字密码破解、百鸡问题等)
- 使用
using namespace std;
简化代码
🔹 一、什么是枚举算法?
📘 定义:
枚举算法(Brute Force / Exhaustive Search)是一种最直接的问题解决方法,它的核心思想是:
“把所有可能的情况都列出来,逐一尝试,找到符合条件的答案。”
✅ 特点:
- 直观易懂:适合新手理解。
- 无需复杂逻辑:只要能列出所有情况即可。
- 效率较低:当数据量大时会非常慢。
🔹 二、枚举算法的步骤
- 确定枚举对象:找出要穷举的内容。
- 设置循环结构:使用
for
或while
遍历所有可能值。 - 添加判断条件:筛选出满足题意的结果。
- 输出结果:打印或返回答案。
🔹 三、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 条评论
-
admin SU @ 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) 是一种最直接、最基础的解决问题的方法。
基本思想:把所有可能的情况都列出来,逐一检查,找出符合条件的解。
它也被称为“穷举法”。
⚙️ 枚举算法的核心思想
- 列出所有可能的候选解
- 对每个候选解进行判断
- 保留满足条件的解
类似于“大海捞针”——你不知道答案在哪里,就一个一个试!
📦 枚举算法的基本模板
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) 是一种最直观、最基本的解决问题的方法。它的核心思想是:
把所有可能的情况都列出来,逐一尝试,找出符合条件的解。
虽然效率不高,但在数据规模较小时非常实用,而且逻辑清晰,非常适合新手学习!
🧠 枚举的基本思路
- 确定枚举对象和范围
- 编写循环结构遍历所有可能值
- 在循环中加入条件判断,筛选出满足条件的结果
📚 使用前提
- 数据量不能太大(否则会超时)
- 没有更高效的算法可用
- 算法逻辑简单,容易实现
🛠️ 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的小数据
🧩 进阶思考题(练练手吧!)
- 找出1000以内的完数(完数=因数之和等于它自己)
- 找出所有的“回文数”(正着读反着读一样的数字)
- 用枚举解决“鸡兔同笼”问题
📌 总结
特点 内容 ✅ 易于理解 逻辑清晰,适合新手 ❌ 效率低 不适合大数据 🔄 多重循环 可解决组合类问题 🧠 适合练习 培养编程思维和调试能力
🎉 结语
🎉 枚举算法就像是一把钥匙,虽然笨重但可以打开很多门。掌握了枚举,你就已经迈出了算法世界的第一步!
继续加油,未来的程序员大佬 👨💻✨
如果你喜欢这个风格,我还可以为你生成更多C++算法系列文章哦!需要的话请告诉我 😄
- 1