top1编程
← 返回题目
题解

含k的个数

1 条题解

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

    P4428 含k的个数(入门)

    解题思路

    输入一个数m和一个数字k,数一数m的数位里有几个k。比如m=48833、k=3,个位和十位都是3,所以答案是2。方法和"统计某个数字出现次数"一样,用逐位拆开:m%10 取出当前个位,判断它等不等于k,等于就计数;m/10 把个位砍掉,循环直到m变成0。题目限定k在0~9之间,而 m%10 的结果只可能是0~9,所以和k比较不会出问题。边界情况:如果k=0,只要m的某一位是0就计数,比如m=100,个位0、十位0,答案是2(百位是1不算);如果m里根本没有k,cnt保持0;m最大不到100000,最多5位,逐位拆开很快。注意循环条件是 while(m),当m被拆成0时循环停止,这时最后一位已经判断过了,不会漏数。

    参考代码

    // 程序用途:逐位拆开正整数m,统计数字k在m的数位上出现的次数
    #include <iostream>
    using namespace std;
    
    int main() {
        int m, k;
        cin >> m >> k;
        int cnt = 0;                    // 计数器,记录k出现的次数
        while (m) {                     // 一直拆到m变成0
            if (m % 10 == k) cnt++;     // 当前这一位等于k就计数
            m /= 10;                    // 去掉个位
        }
        cout << cnt << endl;            // 输出k出现的次数
        return 0;
    }
    

    复杂度分析

    循环次数等于m的位数,m<100000最多5位,所以时间复杂度 O(位数),也可以说 O(log m);额外空间复杂度 O(1)。

    • 1