2026年3月GESP真题及题解(C++二级):数数

题目描述
对于正整数 n n n,如果 n n n 的所有数位中包含恰好 3 3 3 个 2 2 2,Alice 会认为这个正整数是美丽的。例如,正整数 24122 24122 24122 中包含 3 3 3 个 2 2 2,所以 24122 24122 24122 是美丽的;正整数 132 132 132 中包含 1 1 1 个 2 2 2,所以 132 132 132 不是美丽的;正整数 212322 212322 212322 中包含 4 4 4 个 2 2 2,所以 212322 212322 212322 不是美丽的。
Alice 想知道正整数 L L L 到正整数 R R R(包括 L L L 和 R R R)中有多少美丽的正整数,你能帮她数一数吗?
输入格式
输入共 2 2 2 行,第一行为正整数 L L L,第二行为正整数 R R R。
输出格式
输出一行,包含一个整数 C C C,表示 L L L 到 R R R 中 C C C 美丽数的数量。
输入输出样例 1
输入 1
2221
2223
输出 1
2
说明/提示
样例解释
2221 2221 2221 到 2223 2223 2223 中, 2221 2221 2221 与 2223 2223 2223 是美丽的, 2222 2222 2222 不是美丽的。
数据范围
保证 1 ≤ L ≤ R ≤ 10 6 1 \leq L \leq R \leq 10^6 1≤L≤R≤106。
思路分析
题目要求统计区间 [L, R] 内,十进制表示中恰好包含 3 个数字 2 的正整数的个数。
数据范围 1 ≤ L ≤ R ≤ 10 6 1 \leq L \leq R \leq 10^6 1≤L≤R≤106,最大数字为 10 6 10^6 106,即最多 7 位。因此可以采用最直接的暴力枚举法:遍历区间内每一个整数,通过不断取末位并除以 10 的方式分解其十进制各位数字,统计数字 2 出现的次数,如果恰好为 3,则计数器加 1。
遍历次数最多为 10 6 10^6 106,每次分解最多 7 次操作,总运算量约为 7 × 10 6 7 \times 10^6 7×106,在计算机上可以快速完成,且代码实现简单,不易出错。
代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int l, r, ans = 0; // l:区间左端点, r:区间右端点, ans:答案计数器
int main() {
cin >> l >> r; // 输入区间的左右端点
for (int i = l; i <= r; i++) { // 枚举区间内的每一个整数 i
int n = i; // 用临时变量 n 来分解,避免修改循环变量 i
int cnt = 0; // 记录当前数 n 中数字 2 的个数
while (n) { // 当 n 不为 0 时循环(处理所有数位)
if (n % 10 == 2) cnt++; // 取末位,如果是 2 则计数加 1
n /= 10; // 去掉末位,继续处理下一位
}
if (cnt == 3) ans++; // 如果恰好有 3 个 2,答案加 1
}
cout << ans; // 输出最终统计结果
return 0;
}
功能分析
- 输入处理
- 从标准输入读取两个整数
l和r,分别表示区间的左端点和右端点,保证l ≤ r。
- 从标准输入读取两个整数
- 核心计数逻辑
- 使用
for循环遍历区间[l, r]中的每一个整数i。 - 对于每个
i,将其值赋给临时变量n,然后通过while循环逐位分解:n % 10取出当前最低位,判断是否为 2,若是则计数器cnt加 1。n /= 10去掉已处理的最低位,继续处理更高位。
- 循环结束后,比较
cnt是否等于 3,若成立则总答案ans加 1。
- 使用
- 输出结果
- 循环结束后,将
ans输出到标准输出。
- 循环结束后,将
- 复杂度分析
- 时间复杂度 :最坏情况下循环次数为 R − L + 1 ≤ 10 6 R - L + 1 \le 10^6 R−L+1≤106,每个数分解的位数不超过 7,因此总操作次数约为 7 × 10 6 7 \times 10^6 7×106,在 1 秒内完全可以完成。
- 空间复杂度:仅使用了几个整型变量,空间复杂度为 O(1)。
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}
