这题的算法不算复杂,依次考虑每个数字在个位,十位等等 的出现次数累加即可,但是相当的复杂阿。。。。。。

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void count(int n,int a[])
{
    int t=1;
    int ten,p=0,k=n;
    while(n>=10)
    {
        ten=n/10,p=n%10;
        if(t>=10)
            a[0]+=(ten-1)*t;
        else a[0]+=ten*t;
        for(int i=1;i<10;i++)
            a[i]+=ten*t;                    //note
        for(int i=0;i<p;i++)
            a[i]+=t;
        a[p]+=k%t+1;                  //note
        n=ten;
        t*=10;
        //cout<<a[7]<<endl;
    }
    //cout<<"nis "<<n<<endl;
    if(k>=10)
    {
        for(int i=1;i<n;i++)
            a[i]+=t;
        a[n]+=k%t+1;
    }
    else
    {
        for(int i=0;i<=n;i++)
        a[i]++;
    }
    //cout<<a[7]<<endl;
}
void printarr(int a[])
{
     for(int i=0;i<10;i++)
        {
            if(i) printf(" ");
            printf("%d",a[i]);
        }
    printf("\n");
}
int main()
{
    //freopen("a.txt","r",stdin);
    //freopen("c.txt","w",stdout);
    int a1[10],a2[10];
    memset(a1,0,sizeof(a1));
    memset(a2,0,sizeof(a2));
    //count(1199,a1);
    //printarr(a1);
    //count(1748,a2);
    //printarr(a2);
    int n1,n2;
    while(scanf("%d%d",&n1,&n2)&&n1&&n2)
    {
        //int a1[10],a2[10];
        memset(a1,0,sizeof(a1));
        memset(a2,0,sizeof(a2));
        if(n1<n2)
        {
            int tmp=n2;
            n2=n1;n1=tmp;
        }
        count(n1,a1);
        count(n2,a2);
        while(n2)
        {
            a1[n2%10]++;
            n2/=10;
        }
        for(int i=0;i<10;i++)
        {
            if(i) printf(" ");
            printf("%d",a1[i]-a2[i]);
        }
        printf("\n");

    }
    return 0;
}
posted on 2012-04-24 09:04  fakeAcmer  阅读(386)  评论(0编辑  收藏  举报