C++算法题集(教学大纲+16道题)


教学大纲
算法类型学习目标题目数量难度递增
枚举算法遍历所有可能性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. 分阶段教学:每周聚焦1-2种算法,配合2-3道习题

  2. 可视化辅助:用动画展示排序/递归过程

  3. 生活化举例

    • 贪心算法:零钱兑换(用硬币模型)

    • 递推算法:兔子繁殖(斐波那契)

  4. 代码规范

    • 变量名用英文单词(如sum代替s

    • 添加关键注释

    • 缩进对齐

所有代码均使用using namespace std;简化输入输出,控制在20行内,避免复杂语法,适合小学生理解。实际教学时建议配合白板画图讲解算法思想,再过渡到代码实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值