题意: 给两个数n,m 问在[n,m]里面的数,有多少个0
可以一位 一位地计算
设函数f(n)计算0~n包含0 的个数,答案就是f(m) - f(n - 1)
第i位如果不为0,那么这位为0的数将i位是前面的数和(0到999的组合数),比如111 的中间的0的个数就是 1 * 10
如果为0,那么分为前部分为原来的数小于原数,第一部分0的数目为 后面部分数 + 1(0开始),第二部分则转化为第一种i位不为0 的情况
也就是说
n的第i位不为0,个数为n左边的数(高位)*10^i
n的第i位为0 ,个数为(n左边的数-1)*10^i +(i位右边的数+1)
#include<cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll count(ll n)
{
if(n < 0) return 0;
ll c = 1,r,k = 0,ans = 0;
while(n > 9){
r = n % 10; n /= 10;
if(r) ans += n * c;
else ans += (n - 1) * c + k + 1;
k += r * c;
c *= 10;
}
return ans;
}
int main()
{
ll n, m;
while(~scanf("%lld %lld",&m,&n),n >= 0){
printf("%lld\n",count(n) - count(m - 1));
}
return 0;
}