跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

优美数字:三种C++实现

统计不超过n的十进制各数位全部相同的正整数个数。由于n≤2025,可直接枚举1到n分类判断,也可拆位检查,或构造优美数后判断是否在范围内。文中给出了基于位数硬编码、通用拆位、构造过滤三种C++实现方式。

静心发布于 2026/6/23更新于 2026/10/2068 浏览

优美数字:三种C++实现

题目来源:CCF-GESP 2025年9月二级C++。

题目描述

如果一个正整数在十进制下的所有数位都相同,小A认为这个正整数是优美的。例如666、999999。123123123就不优美。小A想知道不超过n的正整数中有多少优美的数字。

输入格式

一行,一个正整数n。

输出格式

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

输入输出样例 #1

输入:

6

输出:

6

输入输出样例 #2

输入:

2025

输出:

28

说明/提示

对于所有测试点,保证1≤n≤2025。

分析与实现

数据范围只有2025,直接枚举1到n也是可以的,但我们可以多想几种写法。

按位数分类直接判断

因为n最大2025,优美数只有1到9(一位数)、11,22,...,99(两位数)、111,222,...,999(三位数),以及1111(四位数)。所以可以针对位数分类统计。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        // 枚举 1 到 n
        if (i < 10) { // 一位数,是优美数
            cnt++;
        } else if (i < 100 && i / 10 == i % 10) { // 两位数且个位与十位相等,是优美数
            cnt++;
        } else if (i < 1000 && i / 100 == i % 10 && i / 10 % 10 == i % 10) { // 三位数且百位与个位相等且十位与个位相等,是优美数
            cnt++;
        } else if (i == 1111) { // 四位数只有 1111 是优美数
            cnt++;
        }
    }
    cout << cnt;
    return 0;
}

这段代码硬编码了位数条件,对于更大的范围就不适用,但针对本题够了。

通用拆位检查

如果需要处理更大的n,我们可以对每个数拆位,判断所有位是否相同。思路是取出个位数字g,然后不断去掉最低位,对比是否都等于g。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int t = i;
        bool flag = true; // 假设 t 为优美数
        int g = t % 10; // 个位
        while (t > 0) {
            if (g != t % 10) { // 任意位不等于个位
                flag = false;
                break;
            }
            t /= 10;
        }
        cnt += flag;
    }
    cout << cnt;
    return 0;
}

这种做法更通用,但每次都要拆位,当n较大时效率较低。

构造优美数再过滤

另一种思路是直接构造所有可能的优美数:由数字d(1~9)构造1位、2位、3位、4位数,判断是否≤n。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    for (int i = 1; i <= 9; i++) { // 枚举组成优美数的数字
        int t = 0;
        for (int j = 1; j <= 4; j++) { // 枚举 1-4 位
            t = t * 10 + i;
            if (t <= n) {
                cnt++;
            }
        }
    }
    cout << cnt;
    return 0;
}

这个方法只会遍历到有限的几个优美数,复杂度与n无关,是最优雅的方式。在本题n极小的情况下体现不出优势,但可以推广到更大的范围。

三种写法都能通过题目,实际选择可以根据自己对代码简洁性和通用性的偏好来定。

目录

  1. 优美数字:三种C++实现
  2. 分析与实现
  3. 按位数分类直接判断
  4. 通用拆位检查
  5. 构造优美数再过滤

更多推荐文章

查看全部
  • 开源知识库 RAGFlow 部署与实战操作详解
  • 基于 Windows 环境搭建 OpenClaw AI 智能体项目操作指南
  • 人工智能基础概念解析:从图灵测试到深度学习
  • Android Studio 更改项目使用的 JDK
  • Python 环境下 Gurobi 安装与配置指南
  • Hive 内置函数参考指南与实践
  • AI × 低代码 × 工程化:Oinone Pamirs 的下一代产品化引擎实践
  • HDFS 核心组件深度解析:分布式文件系统架构基石
  • C++ STL 排序及相关操作算法详解
  • Xilinx FPGA 管脚与时序约束及问题解析
  • LeRobot深度解析:5大核心模块构建下一代机器人学习系统
  • Z-Image ComfyUI:本地化 AI 绘画的高效实践
  • 大语言模型(LLM)入门学习路径与核心技术解析
  • Soft Prompts 微调大模型技术综述:超越 LoRA 的选择
  • Codex 工程级 AI 编程代理快速入门指南
  • C++ 视觉开发:ONNX Runtime(ORT)使用指南
  • GTC 2026 前瞻:Rubin 平台与 AI 工厂化趋势
  • 本地部署 Stable Diffusion 3.5 使用 ComfyUI 教程
  • 利用 AI 智能体快速完成 C 语言与前端课程实训实战指南
  • 深度学习模型优化策略与实战调参

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online