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

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

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

静心发布于 2026/6/23更新于 2026/8/2221 浏览

优美数字:三种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 %  && i /  %  == i % ) { 
            cnt++;
        }   (i == ) { 
            cnt++;
        }
    }
    cout << cnt;
     ;
}
10
10
10
10
// 三位数且百位与个位相等且十位与个位相等,是优美数
else
if
1111
// 四位数只有 1111 是优美数
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. 构造优美数再过滤
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 互联网医疗场景核心技术面试解析
  • mT5 中文-base 模型 WebUI 响应超时与 GPU OOM 优化指南
  • Java 主流框架核心面试题解析:Spring 生态与微服务
  • AI 对话生成 PCB:工具实战、能力边界与工程师未来
  • Python 数据可视化:9 种常用图表及实现方法
  • Windows 10/11 安装与配置 OpenSSH 指南
  • OpenClaw-多飞书机器人与多Agent团队实战复盘
  • OpenClaw AI 编程上下文 Token 限制剖析与扩容实战
  • 医学影像分类器:基于深度学习的肺结节检测
  • 次模函数(Submodular Function):离散优化中的边际收益递减
  • LeetCode 1419 数青蛙:基于模拟的状态机解法
  • MCP Server 实现 Excel 表格一键生成可视化图表 HTML 报告
  • DeepSeek-OCR-WebUI 详解:边界框可视化与多模态识别
  • C++ 哈希表与位图实战:unordered_map/set 底层原理及实现
  • Agent Memory 文献追踪:异构存储与经验记忆机制
  • JavaScript 中的赋值与相等操作符:=、== 和 === 详解
  • Python AI 大模型部署指南:本地运行、API 服务及 Docker 封装
  • OpenClaw Docker 部署教程:飞书/钉钉/QQ 机器人集成
  • 8 篇必读的大模型论文精选
  • 基于用户画像的 Python 音乐推荐系统:Django 协同过滤与 SVD 算法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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