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

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;
}

功能分析

  1. 输入处理
    • 从标准输入读取两个整数 lr,分别表示区间的左端点和右端点,保证 l ≤ r
  2. 核心计数逻辑
    • 使用 for 循环遍历区间 [l, r] 中的每一个整数 i
    • 对于每个 i,将其值赋给临时变量 n,然后通过 while 循环逐位分解:
      • n % 10 取出当前最低位,判断是否为 2,若是则计数器 cnt 加 1。
      • n /= 10 去掉已处理的最低位,继续处理更高位。
    • 循环结束后,比较 cnt 是否等于 3,若成立则总答案 ans 加 1。
  3. 输出结果
    • 循环结束后,将 ans 输出到标准输出。
  4. 复杂度分析
    • 时间复杂度 :最坏情况下循环次数为 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;
}
相关推荐
superkcl20222 小时前
C++初始化列表
开发语言·c++
biter down2 小时前
C++设计一个不能被拷贝的特殊类
开发语言·c++
khddvbe2 小时前
C++中的代理模式实战
开发语言·c++·算法
计算机安禾3 小时前
【C语言程序设计】第31篇:指针与函数
c语言·开发语言·数据结构·c++·算法·leetcode·visual studio
酬勤-人间道3 小时前
自研软件模型处理全流程|个人开发经验分享
c++·经验分享·计算机·计算机图形学·桩号·开挖·回填
郝学胜-神的一滴3 小时前
算法奇旅:探寻3/5/7素因子之第k特殊数——优雅的多路指针解法全解析
数据结构·c++·算法·职场和发展
handler013 小时前
基础算法:分治
c语言·开发语言·c++·笔记·学习·算法·深度优先
2501_924952693 小时前
设计模式在C++中的实现
开发语言·c++·算法