// 将数字序列从第l位到第r位转换为一个整数 inttoInt(vector<int>& digits, int l, int r){ int result = 0; for (int i = l; i >= r; --i) result = result * 10 + digits[i]; return result; }
// 计算10的x次方 intpow10(int x){ int result = 1; while (x--) result *= 10; return result; }
// 计算在0到n范围内数字x出现的次数 intcountX(int n, int x){ if (!n) return0; // 如果n为0,直接返回0 vector<int> digits; // 存储n的每一位数字 while (n) { // 分解n到digits向量中 digits.push_back(n % 10); n /= 10; } n = digits.size();
int cnt = 0; // 用于累计数字x出现的次数 for (int i = n - 1 - !x; i >= 0; --i) { // 不考虑最高位为0的情况(当x=0时) if (i < n - 1) { // 当前位之前的数字组合成的数对结果的贡献 cnt += toInt(digits, n - 1, i + 1) * pow10(i); // 如果x为0,需要减去当前位为0时的情况 if (!x) cnt -= pow10(i); } // 如果当前位等于x,加上当前位右侧数字组成的数+1 if (digits[i] == x) cnt += toInt(digits, i - 1, 0) + 1; // 如果当前位大于x,加上10的i次方 elseif (digits[i] > x) cnt += pow10(i); } return cnt; }
intmain(){ int a, b; while (cin >> a >> b && (a || b)) { // 循环直到输入0 0 if (a > b) swap(a, b); // 确保a<=b for (int i = 0; i < 10; ++i) cout << countX(b, i) - countX(a - 1, i) << " \n"[i == 9]; } return0; }