You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
int a, b;
|
|
|
|
|
|
|
|
|
|
// 统计数字n中存在x=[1,9]的个数情况
|
|
|
|
|
// 建议结合题解中 78501示例的流程进行代码理解和记忆
|
|
|
|
|
int count_x(int n, int x) {
|
|
|
|
|
int res = 0; // 结果
|
|
|
|
|
int t = n; // n的副本
|
|
|
|
|
int base = 1; // base=pow(10,?) 基数
|
|
|
|
|
while (t) { // 数位分离过程中讨论大小关系
|
|
|
|
|
// ① x大于当前数位
|
|
|
|
|
if (t % 10 < x) res += t / 10 * base; // t:最高位到当前位,t/10:最高位到当前位前一位
|
|
|
|
|
// ② x小于当前位,加1
|
|
|
|
|
else if (t % 10 > x)
|
|
|
|
|
res += (t / 10 + 1) * base;
|
|
|
|
|
// ③ x等于当前位
|
|
|
|
|
else
|
|
|
|
|
res += t / 10 * base + (n % base + 1); // 后面的剩余数字+1
|
|
|
|
|
|
|
|
|
|
// 数位分离
|
|
|
|
|
t /= 10; // 前一位
|
|
|
|
|
base *= 10; // 变基
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
对于0,稍作修改,
|
|
|
|
|
此时只需分成两类,因为不存在当前为小于0的情况,不过每次的最高位要排除全0的情况。
|
|
|
|
|
*/
|
|
|
|
|
int count_0(int n) {
|
|
|
|
|
int res = 0; // 结果
|
|
|
|
|
int t = n; // n的副本
|
|
|
|
|
int base = 1; // base=pow(10,?)
|
|
|
|
|
while (t) { // 数位分离过程中讨论大小关系
|
|
|
|
|
// ① 当前位等于0
|
|
|
|
|
if (t % 10 == 0) res += (t / 10 - 1) * base + (n % base + 1);
|
|
|
|
|
// ② 当前位大于0
|
|
|
|
|
else
|
|
|
|
|
res += (t / 10) * base;
|
|
|
|
|
|
|
|
|
|
// 数位分离
|
|
|
|
|
t /= 10; // 前一位
|
|
|
|
|
base *= 10; // 变基
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
// 输入多组数据,以a=0,或b=0视为终点
|
|
|
|
|
while (cin >> a >> b, a || b) {
|
|
|
|
|
if (a > b) swap(a, b); // 这题还可以输入反着的,无聊~
|
|
|
|
|
cout << count_0(b) - count_0(a - 1) << " "; // 单独计算数字0计算结果
|
|
|
|
|
for (int i = 1; i <= 9; i++) // 输出数字1~9的计算结果
|
|
|
|
|
cout << count_x(b, i) - count_x(a - 1, i) << " ";
|
|
|
|
|
cout << endl;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|