计数问题------分治算法练习

题目描述:

给定两个数a和b,计算出1在a和b之间出现的次数。例如,如果a=1024,b=1032,那么a和b之间的数就是:

1024 1025 1026 1027 1028 1029 1030 1031 1032

则有10个1出现在这些数中。

输入:

输入不会超过500行。每行有两个数a和b,a和b的范围是0<a,b<100 000 000。

输入两个0时程序结束,两个0不作为输入样例。

输出:

对于每一对输入的a和b,输出一个数,代表1出现的个数。

样例输入:

1 10

44 497

346 542

1199 1748

0 0

样例输出:

2

185

40

666



解题思路:
此题采用分治算法,每次考虑一位数,进行判断。

代码:
#include <iostream>


using namespace std;
const int N=11;
int d[N];
int value;
void deal(int n);
void deal(int n)
{
    if(n<=0)
        return;
    int one,ten;
    one=n%10;
    n/=10;
    ten=n;
    for(int i=0;i<=one;i++)
        d[i]+=value;
    while(ten)
    {
        d[ten%10]+=(one+1)*value;
        ten/=10;
    }
    for(int i=0;i<=10;i++)
        d[i]+=value*n;
    d[0]-=value;
    value*=10;
    deal(n-1);
}


int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        if(a==0&&b==0)
            break;
        if(a<b)
        {
            int tmp=b;
            b=a;
            a=tmp;
        }
        for(int i=0;i<=10;i++)
            d[i]=0;
        value =1;
        deal(a);
        value=-1;
        deal(b-1);
        cout<<d[1]<<endl;
    }
    return 0;


}



你可能感兴趣的:(计数问题------分治算法练习)