基准时间限制:1 秒 空间限制:131072 KB 分值: 10
难度:2级算法题
给出一段区间a-b,统计这个区间内0-9出现的次数。
比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次。
Input
两个数a,b(1 <= a <= b <= 10^18)
Output
输出共10行,分别是0-9出现的次数
Input示例
10 19
Output示例
1 11 1 1 1 1 1 1 1 1
和数1一个公式
然后公式没法数0 就把所位数加起来减去其他的位数;
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
unsigned long long shu(unsigned long long n,unsigned long long r)
{
unsigned long long l=1,x=n,i,y;
for(i=0;x>9;i++)
{
l=l*10;
x=x/10;
}
y=i; x=n;
//cout<<l<<' '<<i<<endl;
unsigned long long s=0;
while(x>0)
{
if(x/l==r)
{
s=s+x%l+x/l*y*l/10+1;
//cout<<s<<' '<<x%l<<' '<<y*l/10+1<<endl;
}
else if(x/l!=r)
{
s=s+(x/l*y*l/10);
if(x/l>r) s+=l;
//cout<<s<<' '<<y*l/10+l/10<<endl;
}
x=x%l;
l=l/10;
y--;
}
return s;
}
unsigned long long shushu(unsigned long long n)
{
unsigned long long x=n,x1=1,k,l=1,z1,i;
for(i=0;x>0;i++)
{
l=l*10;
x=x/10;
}
k=i;
// cout<<i<<' '<<l/10<<endl;
z1=9;
for(i=1;i<k;i++)
{
x1+=i*z1;
z1=z1*10;
}
x1=x1+k*(n-l/10+1);
return x1;
}
int main()
{
unsigned long long n,m,d[11],p[11],i;
while(cin>>n>>m)
{
n-=1;
unsigned long long s1=0,s2=0;
for(i=1;i<10;i++)
{
d[i]=shu(n,i);
p[i]=shu(m,i);
// cout<<d[i]<<' '<<p[i]<<endl;
s1+=d[i];
s2+=p[i];
}
long long x=shushu(n);
long long y=shushu(m);
d[0]=x-s1;
p[0]=y-s2;
for(i=0;i<10;i++)
{
cout<<p[i]-d[i]<<endl;
}
}
return 0;
}