UVA11038

题目大意:见刘汝佳《算法竞赛入门经典——训练指南》P173

解题思路:

  求出 0 到 m-1 这些数字中 0 出现的次数(此处要特判 m = 0 的情况),再求出 0 到 n 这些数字中 0 出现的次数,后者减去前者即是答案。

  求 0 到某一个数字这些数字中 0 出现的次数:

  从第二高位枚举每一位上 0 出现的次数:1、这一位上的数字是 0,我们以 10030 的百位为例,这一位上的 0 出现的次数为:(10 - 1)*100 + 30 + 1;2、这一位上的数字不是0,我们以 10330 的百位为例,这一位上的 0 出现的次数为:10*100。别忘记考虑 0 哦,所以得出的答案再加上 1 才是正解。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 int main(){
 8     ll m,n;
 9     while(scanf("%lld%lld",&m,&n)==2&&m>=0&&n>=0){
10         m--;
11         ll ans1=0;
12         if(m>=0){
13             ll t1=1;
14             while(m/t1>=100)
15                 t1*=10;
16             while(t1){  //判断条件
17                 if(m/t1%10!=0)
18                     ans1+=m/(t1*10)*t1;
19                 else
20                     ans1+=((m/(t1*10)-1)*t1+m%t1+1);
21                 t1/=10;
22             }
23             ans1++;
24         }
25         else
26             ans1=0;
27 
28         ll ans2=0, t2=1;
29         while(n/t2>=100)
30             t2*=10;
31         while(t2){
32             if(n/t2%10!=0)
33                 ans2+=n/(t2*10)*t2;
34             else
35                 ans2+=((n/(t2*10)-1)*t2+n%t2+1);
36             t2/=10;
37         }
38         ans2++;
39         printf("%lld\n",ans2-ans1);
40     }
41     return 0;
42 }

 

posted @ 2017-10-12 03:09  Blogggggg  阅读(109)  评论(0编辑  收藏  举报