题目: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 }