题解
含k的个数
1 条题解
-
0
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