AcWing 338. 计数问题
原题链接
中等
作者:
L-China
,
2023-01-25 20:51:08
,
所有人可见
,
阅读 257
C++
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
/*
001~abc-1, 999
abc
1. num[i] < x, 0
2. num[i] == x, 0~efg
3. num[i] > x, 0~999
*/
int get(vector<int> num, int l, int r) { // 求 l ~ r的数的大小
int res = 0;
for (int i = l; i >= r; i --)
res = res * 10 + num[i];
return res;
}
int power10(int x) { // 求 10 的 x 次方
int res = 1;
while (x --) res *= 10;
return res;
}
int count(int n, int x) { // 1 ~ n当中,x出现的次数
if (!n) return 0; // 如果n=0,自然是没有的
vector<int> num;
while(n) {
num.push_back(n % 10);
n /= 10;
}
n = num.size();
int res = 0;
for (int i = n - 1 - !x; i >= 0; i --) { // 从最高位开始枚举
if (i < n - 1) {
res += get(num, n - 1, i + 1) * power10(i);
if(!x) res -= power10(i);
}
if (num[i] == x) res += get(num, i - 1, 0) + 1;
else if (num[i] > x) res += power10(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;
}
$\small{分享:}$
$\large\color{red}{— > 算法-STL(C/C++)}$