poj 3286 How many 0's

http://poj.org/problem?id=3286

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<ctime>

#include<queue>

#include<cstring>

#include<set>

#include<cmath>

#include<algorithm>

#define LL long long



using namespace std;



LL Fsum(LL x)

{

    if(x==-1)

    return 0;

    if(x<10)

    return 1;

    LL sum=x/10+1;//末位为0的情况

    for(LL i=10;i*10<=x;i=i*10)//依次向高位排查

    {

        if(x/i%10!=0)

        {

            sum+=(i)*(x/i/10);//此位为非0 它变成0后 它前可以有i 种情况这样后面有 x/i/10 种情况 都比它小

        }else

        {

            sum+=(x/i/10-1)*i+(x%i)+1;//此为为0 比较特殊的是当后面达到最大时 前面的情况数量变了

        }

    }

    //cout<<sum<<endl;

    return (sum);

}

int main()

{

    //freopen("data.txt","r",stdin);

    LL a,b;

    while(cin>>a>>b)

    {

        if(a==-1&&b==-1)

        break;

        cout<<(Fsum(b)-Fsum(a-1))<<endl;;

    }

    return 0;

}

  

你可能感兴趣的:(poj)