#include <algorithm>
#include <cstdio>
using namespace std;
int n, ans;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int v = i % 10, t = i / 10, chk = 1;
while (t) {
if (t % 10 != v)
chk = 0;
t /= 10;
}
ans += chk;
}
printf("%d\n", ans);
return 0;
}题目要求统计不超过 n 的正整数中,所有十进制数位完全相同的数字个数。这类数字被称为“优美数字”,例如 1,6,99,222 等。
输入范围限制为 1≤n≤2025,数据规模很小,可以用直观的方法直接求解。
由于 n 最大只有 2025,我们完全可以遍历 1 到 n 的每一个整数,判断它的每一个十进制数位是否都等于个位数字。如果是,则该数是优美数字,答案加一;否则不是。
判断一个数的所有数位是否相同的方法很多,例如:
ans = 0。i 从 1 到 n:
v = i % 10 为个位数字;t = i / 10 从十位开始逐位检查;t 不为 0 且当前末位 t % 10 不等于 v,则该数不符合条件,标记后跳出循环;t 除以 10 继续向高位检查;v 相等,则 ans 增加 1。ans。这个方法直接对应题目的定义,实现简单,便于理解。
while 循环最多执行 4 次。cpp1#include <cstdio> 2using namespace std; 3 4int n, ans; 5 6int main() { 7 scanf("%d", &n); 8 for (int i = 1; i <= n; i++) { 9 int v = i % 10; // 个位数字 10 int t = i / 10; // 剩余高位 11 int chk = 1; // 标记,1 表示是优美数字 12 while (t) { 13 if (t % 10 != v) { // 某一位与个位不同 14 chk = 0; 15 break; 16 } 17 t /= 10; 18 } 19 ans += chk; 20 } 21 printf("%d\n", ans); 22 return 0; 23}
v = i % 10 获取当前数字的个位,作为全数字的参照值。t = i / 10 用来遍历剩下的更高数位。while(t) 循环中,如果 t % 10 不等于 v,说明该数位与个位不同,将 chk 置为 0 并提前退出循环;否则继续向高位移动 (t /= 10)。chk 仍为 1,则说明所有数位一致,ans 加上 1。ans,即不超过 n 的优美数字的总数。