这个题个人感觉有点难,不容易理解。
题意 给你两个数,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; }