GESP2025年9月认证C++二级( 第三部分编程题(1)优美的数字)
参考程序1:
#include <bits/stdc++.h>
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;
}
参考程序2:
#include <bits/stdc++.h>
using namespace std;int main() {string s;cin >> s; // 把 n 当作字符串处理int k = (int)s.size(); // 位数 kint g = s[0] - '0'; // 最高位数字 g(1..9)// 所有位数小于 k 的优美数int ans = (k - 1) * 9;// 判断 k 位全为 g 的数 t = ggg...g 是否 <= s// 从第二位开始比较(因为第一位 s[0] == g)bool t_le_s = true; // 默认为 true(当所有位都相等时 t == s)for (int i = 1; i < k; ++i) {if (s[i] > s[0]) { // 发现某位大于首位 -> t < s -> 成立t_le_s = true;break;} else if (s[i] < s[0]) { // 发现某位小于首位 -> t > s -> 不成立t_le_s = false;break;}// 相等则继续检查下一位}if (t_le_s) ans += g; // t <= s,k 位优美数有 g 个(1..g)else ans += (g - 1); // t > s,k 位优美数只有 g-1 个(1..g-1)cout << ans << '\n';return 0;
}