|
发表于 2023-11-23 08:22:01
|
显示全部楼层
代码没有明显的逻辑错误,应该能够正常运行并得出正确的结果。
为了提高效率,你可以避免对每个数字都进行除法和模运算的循环,而是直接计算符合条件的数字的数量。
对于一个多位数来说,它要符合条件,只能是形如 100…0、200…0、…、900…0 这样的数字。
因此,你可以直接计算这样的数字有多少个,而不是逐个检查每个数字。
以下是一个改进后的代码示例:
- #include <bits/stdc++.h>
- using namespace std;
- void solve() {
- int n;
- cin >> n;
- int ans = 0;
- // Count single digit numbers (1 to 9).
- ans += min(n, 9);
- // Count multi-digit numbers with only one non-zero digit.
- for (int i = 10; i <= n; i *= 10) {
- // Count numbers like 10, 20, ..., 90, 100, 200, ..., within the range [i, min(n, i*10 - 1)].
- ans += min(n - i + 1, 9);
- }
- cout << ans << endl;
- }
- int main() {
- int t;
- cin >> t;
- while (t--) {
- solve();
- }
- return 0;
- }
复制代码
首先计算了单个数字的数量,然后通过循环以 10 的幂的方式来计算每个数量级上符合条件的数字数量。
这样我们就避免了对每个数字进行检查,大大提高了代码的效率。
请注意,这个代码假设输入的数字 n 是正整数。如果 n 可能是 0 或负数,则需要额外的逻辑来处理这些情况。 |
|