AcWing 338. 计数问题
原题链接
中等
作者:
术
,
2021-03-06 16:38:27
,
所有人可见
,
阅读 232
#include <iostream>
#include <vector>
using namespace std;
vector<int> get(int n)
{
int k=0;
vector<int> v;
while(n)
{
v.push_back(n%10);
n/=10;
}
return v;
}
int get_num(vector<int> v,int l,int r)
{
int res=0;
while(l>=r)
{
res*=10;
res+=v[l--];
}
return res;
}
int power10(int i)
{
int res=1;
while(i--)
{
res*=10;
}
return res;
}
long long count(int n,int x)
{
if(!n)
return 0;
vector<int> v=get(n);
long long res=0;
for(int i=v.size()-1-!x; i>=0; i--)//从高位到低位 x=0时,从第二位开始
{
if(i<v.size()-1)//x在做高位时,不判断abc<xxx
{
res+=get_num(v,v.size()-1,i+1)*power10(i);
if(x==0)
res-=power10(i);//x为0时,从001开始
}
if(v[i]==x)
res+=get_num(v,i-1,0)+1;
else if(v[i]>x)
res+=power10(i);
}
return res;
}
int main()
{
int a,b;
while(cin>>a>>b&&!(a==0&&b==0))
{
if(a>b)
swap(a,b);
for(int i=0; i<10; i++)
cout<<count(b,i)-count(a-1,i)<<" ";
cout<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}