代码没有明显的逻辑错误,应该能够正常运行并得出正确的结果。
为了提高效率,你可以避免对每个数字都进行除法和模运算的循环,而是直接计算符合条件的数字的数量。
对于一个多位数来说,它要符合条件,只能是形如 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 或负数,则需要额外的逻辑来处理这些情况。 |