计数问题
我们采取分情况讨论的一般做法
分情况讨论:
注,当统计0出现的次数时,第
i
i
i位之前的应该从1开始
当我们统计某一位是
x
x
x时,可以分为小于前面的位数,和等于前面的位数,而等于前面的位数又可分为当前这一位等于
x
x
x和小于
x
x
x
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int power10(int i)
{
int res = 1;
while(i --) res *= 10;
return res;
}
int get_num(vector<int>& num, int l, int r)
{
if(l < r) return 0;
int res = 0;
for(int i = l; i >= r; i --)
{
res = res * 10 + num[i];
}
return res;
}
int count(int n, int x)
{
if(!n) return 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 --)
{
res += get_num(num, n - 1, i + 1) * power10(i);
if(!x) res -= power10(i);
if(num[i] == x) res += get_num(num, i - 1, 0) + 1;
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;
}
}