UVa 11038 有多少个0

https://vjudge.net/problem/UVA-11038

题意:

输入两个非负整数m和n,求将m~n的所有整数写出来,一共要写多少个数字0?

思路:

举个例子来说:

12345

从右到左分析各位为0的情况:

最先分析各位5,在它左边是1234,所以当各位为0时,左边可以是0~1234的任何一个数,此时有1234种情况

接下来十位4,在它左边是123,右边可以是0~9的任何一个数,此时为123×10种情况

可以发现每一位的情况数为left×10^i(i为右边的数字个数)

注意:如果该位的数字时0的话,左边的数得减1,但是也别忘了加上右边的数。

比如说:12304 就是122×10+5

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 using namespace std;
11 
12 long long n,m;
13 
14 long long solve(long long n)
15 {
16     if(n<0)  return 0;
17     long long ans=1,right=0,x=1;
18     while(n>=10)
19     {
20         long long now=n%10;
21         n/=10;
22         if(now)   ans+=n*x;
23         else  ans+=(n-1)*x+right+1;
24         right=now*x+right;
25         x*=10;
26     }
27     return ans;
28 }
29 
30 int main()
31 {
32     //freopen("D:\input.txt","r",stdin);
33     while(~scanf("%lld%lld",&n,&m))
34     {
35         if(n==-1 && m==-1)  break;
36         printf("%lld
",solve(m)-solve(n-1));
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6782140.html