51nod 1042 数字0~~9的数量

来源:互联网 发布:淘宝网话费充值平台 编辑:程序博客网 时间:2024/06/06 04:52
1042 数字0-9的数量
基准时间限制: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示例
11111111111

和数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;}








0 0