教学大纲
算法类型 | 学习目标 | 题目数量 | 难度递增 |
---|---|---|---|
枚举算法 | 遍历所有可能性 | 2题 | 简单→应用 |
模拟算法 | 按规则实现过程 | 2题 | 基础→综合 |
排序算法 | 数据整理思想 | 2题 | 手动→优化 |
查找算法 | 数据检索方法 | 2题 | 线性→二分 |
递推算法 | 状态转移思想 | 2题 | 数列→应用 |
贪心算法 | 局部最优策略 | 2题 | 基础→实际 |
递归算法 | 函数自我调用 | 2题 | 数学→组合 |
综合应用 | 混合运用能力 | 2题 | 巩固→提升 |
一、枚举算法
1. 水仙花数(oj)
题目:输出所有三位水仙花数(如153=1³+5³+3³)。
cpp
#include <iostream> using namespace std; int main() { for (int i = 100; i <= 999; i++) { int a = i / 100, b = i / 10 % 10, c = i % 10; if (a*a*a + b*b*b + c*c*c == i) cout << i << " "; } return 0; }
解释:遍历100-999,拆出百位/十位/个位,验证立方和。
2. 鸡兔同笼(应用)
题目:已知头数n,脚数m,求鸡兔各几只(无解输出"No")。
cpp
#include <iostream> using namespace std; int main() { int n, m; cin >> n >> m; for (int rabbit = 0; rabbit <= n; rabbit++) { int chicken = n - rabbit; if (2*chicken + 4*rabbit == m) { cout << chicken << " " << rabbit; return 0; } } cout << "No"; return 0; }
解释:枚举兔子数量(0到n),根据总脚数验证。
笼子里面有鸡和兔子若干,3个头,10只脚请
问,鸡和兔子各多少只
设鸡的数量为 x,兔子的数量为 y:
x + y = 3(头的数量)
2x + 4y = 10(脚的数量)
二、模拟算法
1. 数字反转(基础)
题目:反转整数(-120 → -21)。
cpp
#include <iostream> using namespace std; int main() { int n, rev = 0; cin >> n; while (n) { rev = rev * 10 + n % 10; n /= 10; } cout << rev; return 0; }
解释:循环取余数,拼接到反转数。
2. 时间转换(综合)
题目:秒数转"时:分:秒"格式(3661秒 → 1:1:1)。
cpp
#include <iostream> using namespace std; int main() { int t, h, m, s; cin >> t; h = t / 3600; t %= 3600; m = t / 60; s = t % 60; cout << h << ":" << m << ":" << s; return 0; }
解释:按进制转换(3600秒=1小时,60秒=1分)。
三、排序算法
1. 三数排序(手动)
题目:输入三个数,按从小到大输出。
cpp
#include <iostream> using namespace std; int main() { int a, b, c; cin >> a >> b >> c; if (a > b) swap(a, b); if (b > c) swap(b, c); if (a > b) swap(a, b); cout << a << " " << b << " " << c; return 0; }
解释:三次比较交换确保顺序。
2. 数组升序(优化)
题目:输入n个数,用sort
排序输出。
cpp
#include <iostream> #include <algorithm> using namespace std; int main() { int n, a[100]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); for (int i = 0; i < n; i++) cout << a[i] << " "; return 0; }
解释:使用STL的sort
快速排序。
四、查找算法
1. 线性查找(基础)
题目:在数组中查找x,输出位置(从1开始)。
cpp
#include <iostream> using namespace std; int main() { int n, x, a[100]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; cin >> x; for (int i = 0; i < n; i++) { if (a[i] == x) { cout << i + 1; return 0; } } cout << -1; return 0; }
解释:遍历数组,找到即输出位置。
2. 二分查找(提升)
题目:在有序数组中二分查找x。
cpp
#include <iostream> using namespace std; int main() { int n, x, a[100]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; cin >> x; int left = 0, right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (a[mid] == x) { cout << mid + 1; return 0; } if (a[mid] < x) left = mid + 1; else right = mid - 1; } cout << -1; return 0; }
解释:每次缩小一半搜索范围。
五、递推算法
1. 斐波那契数列(基础)
题目:求第n项斐波那契数(1,1,2,3,5,...)。
cpp
#include <iostream> using namespace std; int main() { int n, a = 1, b = 1; cin >> n; for (int i = 3; i <= n; i++) { int c = a + b; a = b; b = c; } cout << (n == 1 ? 1 : b); return 0; }
解释:从前往后逐步计算每一项。
2. 爬楼梯(应用)
题目:每次爬1/2阶,n阶楼梯有几种走法?
cpp
#include <iostream> using namespace std; int main() { int n, f[31] = {1, 1}; cin >> n; for (int i = 2; i <= n; i++) f[i] = f[i - 1] + f[i - 2]; cout << f[n]; return 0; }
解释:f[i] = f[i-1] + f[i-2]
(斐波那契变形)。
六、贪心算法
1. 硬币问题(基础)
题目:用1/5/10元硬币凑n元,最少硬币数。
cpp
#include <iostream> using namespace std; int main() { int n, ans = 0; cin >> n; ans += n / 10; n %= 10; ans += n / 5; n %= 5; ans += n; cout << ans; return 0; }
解释:优先用大面额硬币。
2. 简单背包(应用)
题目:装尽可能多苹果,背包容量m,苹果重量w。
cpp
#include <iostream> #include <algorithm> using namespace std; int main() { int m, n, w[100], ans = 0; cin >> m >> n; for (int i = 0; i < n; i++) cin >> w[i]; sort(w, w + n); // 先排序 for (int i = 0; i < n; i++) { if (m < w[i]) break; m -= w[i]; ans++; } cout << ans; return 0; }
解释:优先装小重量苹果(贪心策略)。
七、递归算法
1. 阶乘计算(数学)
题目:递归求n!(5! = 120)。
cpp
#include <iostream> using namespace std; int fac(int n) { return n <= 1 ? 1 : n * fac(n - 1); } int main() { int n; cin >> n; cout << fac(n); return 0; }
解释:n! = n * (n-1)!
,基线条件n=1
。
2. 组合问题(提升)
题目:递归求组合数C(n,k) = C(n-1,k) + C(n-1,k-1)。
cpp
#include <iostream> using namespace std; int C(int n, int k) { if (k == 0 || k == n) return 1; return C(n - 1, k) + C(n - 1, k - 1); } int main() { int n, k; cin >> n >> k; cout << C(n, k); return 0; }
解释:组合数递推公式,注意边界条件。
八、综合应用
1. 数组最值(巩固)
题目:求数组最大值和最小值。
cpp
#include <iostream> #include <climits> using namespace std; int main() { int n, a[100], min = INT_MAX, max = INT_MIN; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] < min) min = a[i]; if (a[i] > max) max = a[i]; } cout << "Min: " << min << "\nMax: " << max; return 0; }
解释:遍历时同步更新最值。
2. 质数筛法(提升)
题目:用筛法输出100以内所有质数。
cpp
#include <iostream> using namespace std; int main() { bool is_prime[101] = {false}; // 0-100 for (int i = 2; i <= 100; i++) is_prime[i] = true; for (int i = 2; i <= 100; i++) { if (!is_prime[i]) continue; for (int j = i * 2; j <= 100; j += i) is_prime[j] = false; } for (int i = 2; i <= 100; i++) if (is_prime[i]) cout << i << " "; return 0; }
解释:标记倍数法,高效筛选质数。
教学建议
-
分阶段教学:每周聚焦1-2种算法,配合2-3道习题
-
可视化辅助:用动画展示排序/递归过程
-
生活化举例:
-
贪心算法:零钱兑换(用硬币模型)
-
递推算法:兔子繁殖(斐波那契)
-
-
代码规范:
-
变量名用英文单词(如
sum
代替s
) -
添加关键注释
-
缩进对齐
-
所有代码均使用
using namespace std;
简化输入输出,控制在20行内,避免复杂语法,适合小学生理解。实际教学时建议配合白板画图讲解算法思想,再过渡到代码实现。