202509-优美的数字(luogu-B4411)
GESP C++ 2025年9月二级真题,多层循环练习,难度★✮☆☆☆。
luogu-B4411 [GESP202509 二级] 优美的数字
题目要求
题目描述
如果一个正整数在十进制下的所有数位都相同,小 A 就会觉得这个正整数很优美。例如,正整数 的数位都是 ,所以 是优美的。正整数 的数位都是 ,所以 是优美的。正整数 的数位不都相同,所以 并不优美。
小 A 想知道不超过 的正整数中有多少优美的数字。你能帮他数一数吗?
输入格式
一行,一个正整数 。
输出格式
一行,一个正整数,表示不超过 的优美正整数的数量。
输入输出样例 #1
输入 #1
6
输出 #1
6
输入输出样例 #2
输入 #2
2025
输出 #2
28
说明/提示
对于所有测试点,保证 。
题目分析
本题要求统计不超过 的“优美数字”个数,优美数字即十进制各位数字全部相同的正整数。
核心思路:逐一枚举 ,对当前数字拆位并比较是否所有位都相等。
枚举阶段
用单层循环 从 到 ,逐个检查。拆位比较
若 是个位数(),直接计入答案;
否则取出最低位 ,再依次把其余位与 比较,出现不同则标记失败。统计答案
所有位均相同则计数器 。复杂度
时间复杂度 , 完全够用;
空间复杂度 。边界与细节
- 输入保证 ,无需大整数。
- 拆位时先取模再整除,注意循环终止条件。
- 个位数特判可省去拆位步骤,略微加速。
示例代码
#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 认证学习微信公众号

最后更新于