标签:
问题链接:POJ3286 How many 0‘s?。问题简述:输入无符号整数m和n,满足m<=n,计算m到n(包括m和n)之间各个数中包含多少个0。
问题分析:先分别计算0到m-1和0到n之间数的0个数,结果=0到n之间数的0个数-0到m-1之间数的0个数。计算0到n之间数的0个数时,先考虑1位数、2位数、......,在小于n的区间逐步统计。程序说明:数组radix[]计算存放10进制的位权备用。函数countzero()用于统计0到n之间数的0个数。
AC的C语言程序如下:
/* POJ3286 How many 0's? */
#include <stdio.h>
typedef long long LL;
#define MAXN 10
LL radix[MAXN+1];
void maketable()
{
int i;
radix[0] = 1;
for(i=1; i<=MAXN; i++)
radix[i] = radix[i-1] * 10;
}
LL countzero(LL n)
{
if(n < 0)
return 0;
LL sum = 1;
int i = 1;
while(radix[i] <= n) {
LL digit, left, right;
digit = n % radix[i] / radix[i - 1];
if (digit == 0) {
left = n / radix[i];
right = n % radix[i - 1];
sum += (left - 1) * radix[i - 1] + right + 1;
} else {
left = n / radix[i];
sum += left * radix[i - 1];
}
i++;
}
return sum;
}
int main(void)
{
maketable();
LL m, n;
while(scanf("%lld%lld", &m, &n) != EOF) {
if(m == -1 && n == -1)
break;
printf("%lld\n", countzero(n) - countzero(m-1));
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/tigerisland45/article/details/52259396