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

  

原文地址:https://www.cnblogs.com/liulangye/p/2615583.html