码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3286 How many 0's?

时间:2016-08-20 10:17:15      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

问题链接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;
}




POJ3286 How many 0's?

标签:

原文地址:http://blog.csdn.net/tigerisland45/article/details/52259396

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!