题目:
题解:
分情况统计
例如要统计
1
1
1的个数,可以统计
1
1
1在每一位上的个数,然后相加
此时要注意一种特殊情况,即要统计
0
0
0的个数
例如要统计
0
0
0在第
4
4
4位的个数的时候,应该注意,前三位不能都为
0
0
0
所以此时 x x x < a b c xxx < abc xxx<abc的时候取值范围变成了 1 < = x x x < a b c 1 <= xxx < abc 1<=xxx<abc,所以此时 a n s + = ( x x x − 1 ) ∗ 1000 ans+=(xxx-1) * 1000 ans+=(xxx−1)∗1000
当 x x x = a b c xxx=abc xxx=abc的时候要保证 x x x xxx xxx不为 0 0 0
上代码!
#include <bits/stdc++.h>
using namespace std;
int dig(long long n)
{
int res=0;
while(n)
{
res++;
n/=10;
}
return res;
}
long long con(long long x,int i)
{
int d=dig(x);
long long ans=0;
for(int j=1;j<=d;j++)//从右向左的第j位
{
int p=1;
for(int k=1;k<=j-1;k++) p*=10;
int l=x/p/10,r=x%p,dj=x/p%10;//dj为从右到左的第j位,l是dj左边的整数,r是dj右边的整数
//0<=xxx<abc
if(i) ans+=l*p;
if(!i&&l) ans+=(l-1)*p;
//xxx=abc
if(dj>i&&(i||l)) ans+=p;
if(dj==i&&(i||l)) ans+=r+1;
}
return ans;
}
int main()
{
long long a,b;
while(cin>>a>>b)
{
if(a==0&&b==0) break;
if(a>b) swap(a,b);
for(int i=0;i<=9;i++)
{
cout<<con(b,i)-con(a-1,i)<<" ";
}
cout<<endl;
}
return 0;
}