题目

试题名称:优美的数字
时间限制:1.0s
内存限制:512.0MB
题目描述
如果一个正整数nnn在十进制下的所有数位都相同,小A就会觉得这个正整数很优美。例如,正整数6的数位都是6,所以6是优美的。正整数99的数位都是9,所以99是优美的。正整数123的数位不都相同,所以123并不优美。
小A想知道不超过nnn的正整数中有多少优美的数字。你能帮他数一数吗?
输入格式
一行,一个正整数nnn
输出格式
一行,一个正整数,表示不超过nnn的优美正整数的数量。
输入样例1

6

输出样例1

6

输入样例2

2025

输出样例2

28

数据范围
对于所有测试点,保证1≤n≤20251 \le n \le 20251n2025

解析

方式一

官方解法中,是传统的思路:遍历1~nnn之间的所有数字,然后拆分数位,之后判断数位是否一致。

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

int n, ans;

int main()
{
	// 获取数字n 
	scanf("%d", &n);
	// 遍历1~n之间的所有数字
	for (int i = 1; i <= n; i++) {
		// v和t拆分数位,chk表示用于标记是否是优美数字 
		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;
}

方式二

根据题目,优美的数字指的就是各个数位上的数字一致,即:
x,xx,xxx,xxxx,xxxxx,… x,xx,xxx,xxxx,xxxxx,\dots xxxxxxxxxxxxxxx
即由单个数字xxx重复来构成的。所以,本题的解题思路也可以如下:

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

int main()
{
	// 获取正整数n
	int n;
	cin >> n;
	// 记录个数
	int x = 0; 
	// 即1~9之间的数字重复构成优美数字
	for (int i = 1; i < 10; i++){
		// 记录优美的数字
		int a = i;
		while ( a <= n){
			x++;
			a = a * 10 + i; 
		}
	} 
	cout << x;

	return 0;
}

总结

相对而言,2025年09月份的二级题目难度比2025年06月份题目的难度要略低一些,比较符合GESP二级考生的水平。对于本题而言,除了上述解法,如果学习过字符串等,也可以考虑字符串等方式。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐