202509-优美的数字(luogu-B4411)

202509-优美的数字(luogu-B4411)

GESP C++ 2025年9月二级真题,多层循环练习,难度★✮☆☆☆。

luogu-B4411 [GESP202509 二级] 优美的数字

题目要求

题目描述

如果一个正整数在十进制下的所有数位都相同,小 A 就会觉得这个正整数很优美。例如,正整数 66 的数位都是 66,所以 66 是优美的。正整数 9999 的数位都是 99,所以 9999 是优美的。正整数 123123 的数位不都相同,所以 123123 并不优美。

小 A 想知道不超过 nn 的正整数中有多少优美的数字。你能帮他数一数吗?

输入格式

一行,一个正整数 nn

输出格式

一行,一个正整数,表示不超过 nn 的优美正整数的数量。

输入输出样例 #1

输入 #1
6
输出 #1
6

输入输出样例 #2

输入 #2
2025
输出 #2
28

说明/提示

对于所有测试点,保证 1n20251 \leq n \leq 2025


题目分析

本题要求统计不超过 nn 的“优美数字”个数,优美数字即十进制各位数字全部相同的正整数。
核心思路:逐一枚举 1n1\sim n,对当前数字拆位并比较是否所有位都相等。

  1. 枚举阶段
    用单层循环 ii11nn,逐个检查。

  2. 拆位比较
    ii 是个位数(i<10i<10),直接计入答案;
    否则取出最低位 last_bit\textit{last\_bit},再依次把其余位与 last_bit\textit{last\_bit} 比较,出现不同则标记失败。

  3. 统计答案
    所有位均相同则计数器 +1+1

  4. 复杂度
    时间复杂度 O(nlog10n)O(n\cdot\log_{10}n)n2025n\le 2025 完全够用;
    空间复杂度 O(1)O(1)

  5. 边界与细节

    • 输入保证 1n20251\le n\le 2025,无需大整数。
    • 拆位时先取模再整除,注意循环终止条件。
    • 个位数特判可省去拆位步骤,略微加速。

示例代码

#include <iostream>

int main() {
    int n;
    std::cin >> n; // 读入正整数 n
    int count = 0; // 用于统计满足条件的数字个数
    for (int i = 1; i <= n; i++) { // 枚举 1 到 n 的每个数字
        bool flag = true; // 标记当前数字是否所有位都相同
        int cur_num = i;
        if (i < 10) {
            // 个位数一定满足条件
            count++;
        } else {
            int last_bit = cur_num % 10; // 取最低位
            cur_num /= 10;
            while (cur_num > 0) {
                int cur_bit = cur_num % 10; // 取当前最低位
                if (cur_bit != last_bit) {
                    // 如果有一位不同,则不满足条件
                    flag = false;
                    break;
                }
                cur_num /= 10; // 去掉最低位
            }
            if (flag) {
                // 如果所有位都相同,计数加一
                count++;
            }
        }
    }
    std::cout << count; // 输出结果
    return 0;
}

本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
最后更新于