top1编程
← 返回题目
题解

幸运数字

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4382 幸运数字(入门)

    解题思路

    每个学生的幸运数字是 0 到 9 之间的整数,题目要我们统计喜欢每个数字的学生人数。

    数字一共只有 10 种,最适合用"计数数组":开一个长度为 10 的数组 cnt,cnt[x] 就表示喜欢数字 x 的学生人数。读入每个学生的时候,直接用 cnt[x]++ 把对应数字的人数加 1。全部读完后,依次输出 cnt[0]、cnt[1]……cnt[9] 就行了。

    拿样例验证:12 个学生喜欢的数字是 0 9 9 7 7 6 6 6 8 8 8 6。喜欢 0 的有 1 人,喜欢 1 到 5 的都是 0 人,喜欢 6 的有 4 人,喜欢 7 的有 2 人,喜欢 8 的有 3 人,喜欢 9 的有 2 人。输出 "1 0 0 0 0 0 4 2 3 2",和样例一致。

    边界情况:数组一定要先初始化成 0,写成 int cnt[10] = {0},否则数组里是垃圾值。数字 0 也要统计,数组下标从 0 开始正好对应。输出时 10 个数之间用空格隔开,最后一个数后面不要有多余空格。

    参考代码

    // 程序用途:统计n名同学幸运数字0~9各出现多少次(受欢迎程度)
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int cnt[10] = {0};                // cnt[x]表示喜欢数字x的学生人数
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;                     // 读入一个幸运数字
            cnt[x]++;                     // 对应数字的人数加1
        }
        for (int i = 0; i < 10; i++) {    // 依次输出0~9各自的人数
            if (i > 0) cout << " ";
            cout << cnt[i];
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    要读入 n 个数,循环 n 次,时间复杂度是 O(n);计数数组长度固定为 10,额外空间复杂度是 O(1)。

    • 1