#include<iostream>
using namespace std;
#define N 5
int f(int n) { //求1-n中含有数字N的数字个数
int k = 0, h = 1, p1 = 0, p2 = 1;
while (n >= (h * 10)) {
h *= 10;
}
while (h&&n >= h) {
if (n / h % 10 == N) {
k += n % h + 1;
n -= n % h;
break;
}
h /= 10;
}
for (int i = 1; i <= n; i *= 10) {
k += (n / i % 10) * p1;
if (n / i % 10 > N)k += p2 - p1 * 10;
p1 = p2;
p2 = p2 * 9 + 10 * i;
}
return k;
}
int main() {
int n;
cin >> n;
cout << f(n) << endl;
return 0;
}
时间复杂度O(logn),空间复杂度O(1)。