How Many O's? UVA - 11038

这个题个人感觉有点难,不容易理解。

题意 给你两个数,n,m,找出从n到m所有的数一共包含几个0,看似简单,包含0的不就都是整数么,然后就用暴力循环来找,绝对TL。我自己写这题也没有什么好的办法,没有头绪,也是听别人讲的才明白这个方法,确实厉害。

剥离锁位(名字什么随便起的,下面代码思路及注释)

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long LL;
LL OO(LL left)//此外函数即为本题核心代码及思想。只看代码的话不容易理解,自己找点小的数代入用这个方法解解看,就会明白了。以后类似的找包含别的数字的个数题就可以用这种方法。
{
    LL n=1,mid,right=0,s=0;//从个位开始剥离,依次锁位,就是先定个位为0算有多少个,再定十位为0,算有多少个,以此类推往后算,需要注意每次都不要忘记右侧的数的界限,还有右侧的个数不要忘记加上就可以了
    while(left>9)
    {
        mid=left%10;
        left/=10;
        if(mid==0)
            s+=(left-1)*n+right+1;
        else
            s+=left*n;
        right=right+mid*n;
        n*=10;
    }
    return s;
}
int main()
{
    LL i,n,m,a,b,s;
    while(scanf("%lld%lld",&m,&n),m!=-1&&n!=-1)
    {
        a=OO(m-1);
        b=OO(n);
        s=b-a;
        if(m==0)
            s++;
        printf("%lld\n",s);
    }
    return 0;
}

 

posted @ 2018-02-26 18:17  NoRain丶  阅读(116)  评论(0编辑  收藏  举报