poj 3268

题目:http://poj.org/problem?id=3286

假设从 1 到 m的数中 含有 0 的个数为 numm,从 1 到 n 含有 0 的个数为 numn 那么要求 从 n 到 m 的数里含有 0 的个数 ans = numm - numn + sum(n 里面含有 0 的个数)

对于给的数N,从右到左枚举每一位,当枚举第 i 位时,它左边的数记为 left,从它自身到最后记为 right,

  1 若第 i 位为 0 ,说明 N里面本身有一个0 , 求出比 left 0 right(— 0 —) 小的数+1   加至 sum ;              

  2 若第i 位不为0,则 N 该位没0,那么小于 left 0 right (— 0 —)的数都是小于N的, 算出   加至 sum ;

重复以上两个过程,直至left < 10 ;

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <math.h>
 7 #include <queue>
 8 #include <set>
 9 #define N 1010
10 #define inf 100000007
11 #define _clr(a,val) (memset(a,val,sizeof(a)))
12 
13 using namespace std;
14 
15 typedef long long ll;
16 
17 ll cal(ll m)
18 {
19     ll l,r,d;
20     ll p = 1;
21     ll sum = 0;
22     l = m; r = 0;
23     while(1)
24     {
25         if(l < 10) break;
26         d = l % 10;
27         l /= 10;
28         if(d)
29         {
30             sum += l * p;
31         }
32         else sum += (l - 1) * p + r + 1;
33         r = d * p + r;
34         p *= 10;
35     }
36     return sum;
37 }
38 int main()
39 {
40     ll n,m;
41     ll temp;
42     //freopen("data.txt","r",stdin);
43     while(cin>>n>>m)
44     {
45         if(n == -1 && m == -1) break;
46         temp = 0;
47         ll ans1 = cal(m);
48         ll ans2 = cal(n);
49         do
50         {
51             int d = n % 10;
52             n /= 10;
53             if(!d) temp++;
54         }while(n);
55         ll ans = ans1 - ans2 + temp;
56         cout<<ans<<endl;
57     }
58     return 0;
59 }
原文地址:https://www.cnblogs.com/fxh19911107/p/2645205.html