小韦老师@NOIP 普及组-2013-计数问题
题目:
描述
试计算在区间 1 到 n 的所有整数中,数 字 x ( 0 ≤ x ≤ 9 )共出现多少次?例如,在 1 到 11 中,即在 1、2、3、4 、5、6、7、8 、9、10、11 中,数字 1 出现了 4 次。
输入
输入共 1 行,包含 2 个整数 n 和 x,之间用一个空格隔开。
输出
输出共 1 行,包含一个整数,表示 x 出现的次数。
输入样例1
11 1
输出样例1
4
题解:
整体思路:
枚举 1~n,将每个整数含有的 x 的数量加起来,即为所求。
具体步骤:
1.定义两个变量 n 和 x,并输入 n 和 x。
2.定义一个计数器:
int cnt = 0; // 计数器,用来记录 1~n 中总共有多少个 x
3.枚举 1~n,将用自定义函数用来求当前数包含 x 的数量,并将这个数量累加到累加器中。
for (int i = 1; i <= n; i++) { // 枚举 1~n
cnt += count(i, x); // 将当前数包含 x 的个数累加到累加器
}
4.输出累加器:
cout << cnt; // 输出计数器
5.自定义函数 count 的实现:
// 用来数 i 含有 x 的数量,并返回这个数量
int count(int i, int x) {
int cnt = 0; // 计数器,用来记录 i 含有 x 的数量
while (i != 0) { // 当 i 不为 0 时
if (i % 10 == x) cnt++; // 若当前 i 的最右边一位为 x,则计数器加 1
i /= 10; // 将刚刚处理过的 i 的最右边一位去掉
}
return cnt; // 返回计数器
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
// 用来数 i 含有 x 的数量,并返回这个数量
int count(int i, int x) {
int cnt = 0; // 计数器,用来记录 i 含有 x 的数量
while (i != 0) { // 当 i 不为 0 时
if (i % 10 == x) cnt++; // 若当前 i 的最右边一位为 x,则计数器加 1
i /= 10; // 将刚刚处理过的 i 的最右边一位去掉
}
return cnt; // 返回计数器
}
int main() {
int n, x;
cin >> n >> x;
int cnt = 0; // 计数器,用来记录 1~n 中总共有多少个 x
for (int i = 1; i <= n; i++) { // 枚举 1~n
cnt += count(i, x); // 将当前数包含 x 的个数累加到累加器
}
cout << cnt; // 输出累加器
return 0;
}