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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”