AcWing 338. 计数问题
原题链接
中等
作者:
邓泽军
,
2019-09-09 23:11:33
,
所有人可见
,
阅读 1001
C++ 代码
#include <bits/stdc++.h>
using namespace std;
/*
abc d efg
求1的个数
(1) 0 ~ abc-1 1 0 ~ 999 // abc * 1000
(2) abc
d < 1 abc0 < abc1 // 0;
d == 1 abc1 0 ~ efg // efg + 1;
d > 1 0 ~ 999 // 1000;
(3) 特殊情况:
求0,那么0不能放在第一个位置,而且(1)中需要减掉1000,因为此时是001 ~ abc - 1 1 0 ~ 999 // (abc - 1) * 1000;
*/
int get(vector<int> nums, int l, int r) {
int res = 0;
for (int i = l; i <= r; i ++) {
res = res * 10 + nums[i];
}
return res;
}
int count (int n, int x) {
if (!n) return 0;
vector<int> nums;
while(n) {
nums.push_back(n % 10);
n /= 10;
}
reverse(nums.begin(), nums.end());
n = nums.size();
int res = 0;
for (int i = 0 + !x; i < n; i ++) { //注意这个地方如果枚举的是0,那么i需要从1开始。
if (i > 0) {
res += get(nums, 0, i - 1) * pow(10, n - 1 - i);
if (!x) res -= pow(10, n - 1 - i);
}
if (x == nums[i]) { //这个地方是nums[i] 和 x比较不是i。
res += get(nums, i + 1, n - 1) + 1;
}
else if (nums[i] > x) {
res += pow(10, n - 1 - i);
}
}
return res;
}
int main() {
int a, b;
while (cin >> a >> b && (a || b)) {
if (a > b) swap(a, b);
for (int i = 0; i < 10; i ++) {
cout << count(b, i) - count(a - 1, i) << ' ';
}
cout << endl;
}
return 0;
}