小韦老师@NOIP 普及组-2010-数字统计
题目:
描述
请统计某个给定范围 [L, R] 的所有整数中,数字 2 出现的次数。
比如给定范围 [2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次。
输入
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出
输出共 1 行,表示数字 2 出现的次数。
输入样例1
2 22
输出样例1
6
输入样例2
2 100
输出样例2
20
题解:
思路:
整体思路:
枚举 L~R,将每个整数含有的 2 的数量加起来,即为所求。
具体步骤:
1.定义两个变量 l 和 r,用来表示 L 和 R,即闭区间的左端点和右端点。并输入 l 和 r。
2.定义一个计数器:
int cnt = 0; // 计数器,用来记录 2 总共出现的次数
3.枚举 l~r,将用自定义函数用来求当前数包含 2 的数量,并将这个数量累加到累加器中。
for (int i = l; i <= r; i++) { // 枚举闭区间 [l, r] 的每一个整数
cnt += count(i); // 将当前数包含的 2 的个数累加到累加器中
}
4.输出累加器:
cout << cnt; // 输出计数器
5.自定义函数 count 的实现:
// 用来数 x 含有几个 2,返回 2 的个数
int count(int x) {
int cnt = 0; // 计数器,用来记录 x 含有的 2 的个数
while (x != 0) { // 当 x 部位 0 时
if (x % 10 == 2) cnt++; // 若当前 x 的最右边一位是 2,则计数器加 1
x /= 10; // x 将刚刚处理过的最右边一位去掉
}
return cnt; // 返回计数器
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
// 用来数 x 含有几个 2,返回 2 的个数
int count(int x) {
int cnt = 0; // 计数器,用来记录 x 含有的 2 的个数
while (x != 0) { // 当 x 部位 0 时
if (x % 10 == 2) cnt++; // 若当前 x 的最右边一位是 2,则计数器加 1
x /= 10; // x 将刚刚处理过的最右边一位去掉
}
return cnt; // 返回计数器
}
int main() {
int l, r; // 闭区间的左端点和右端点
cin >> l >> r;
int cnt = 0; // 计数器,用来记录 2 总共出现的次数
for (int i = l; i <= r; i++) { // 枚举闭区间 [l, r] 的每一个整数
cnt += count(i); // 将当前数包含的 2 的个数累加到累加器中
}
cout << cnt; // 输出计数器
return 0;
}