Jimmy writes down the decimal representations of all natural numbers between and including m and n, (m ≤ n). How many zeroes will he write down?
Input
Input starts with an integer T (≤ 11000), denoting the number of test cases.
Each case contains two unsigned 32-bit integers m and n, (m ≤ n).
Output
For each case, print the case number and the number of zeroes written down by Jimmy.
Sample Input | Output for Sample Input |
5 10 11 100 200 0 500 1234567890 2345678901 0 4294967295 | Case 1: 1 Case 2: 22 Case 3: 92 Case 4: 987654304 Case 5: 3825876150 |
给你一个区间,问这个区间里所有数字共有多少个0。
注意前导零的判断,还有得开二维的,一维的不知道怎么写。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1e9
#define endl '\n'
#define LL long long
using namespace std;
LL dp[20][20];
int a[20];
LL dfs(int len,int s,int num,int fp)//s判断有没有前导零
{
if(!len)
return s == 0 ? (LL)1 : (LL)num;
if(!fp && s && dp[len][num] != -1)
return dp[len][num];
int n = fp ? a[len]:9;
LL res = 0;
for(int i=0;i<=n;i++)
{
if(i==0)
{
if(s)
res += dfs(len-1,s,num + 1,fp&&i==n);
else
res += dfs(len-1,0,num,fp&&i==n);
}
else
res += dfs(len-1,1,num,fp&&i==n);
}
if(!fp && s)
dp[len][num] = res;
return res;
}
LL sum(LL x)
{
int len = 0;
while(x)
{
a[++len] = x % 10;
x /= 10;
}
return dfs(len,0,0,1);
}
int main(void)
{
int T;
scanf("%d",&T);
memset(dp,-1,sizeof(dp));
int cas = 1;
while(T--)
{
LL n,m;
scanf("%lld%lld",&n,&m);
LL ans = sum(m) - sum(n-1);
printf("Case %d: %lld\n",cas++,ans);
}
return 0;
}