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

UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem

时间:2016-08-20 11:49:13      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

Regionals 2004 >> Asia - Shanghai

问题链接UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem

问题简述:输入m和n,计算m到n(包括m和n)之间各个数中包含多少个0-9数字。

问题分析:先分别计算0到m-1和0到n之间数的数字个数,结果=0到n之间数的数字个数-0到m-1之间数的数字个数。计算0到n之间数的数字个数时,先考虑1位数、2位数、......,在小于n的区间逐步统计。

程序说明:数组radix[]计算存放10进制的位权备用。函数countdigit()用于统计0到n之间数的0-9个数。

这个程序在POJ中,用C语言提交出现错误,也许是其C语言版本太低有关,用GCC提交可以通过。其他地方用C语言提交即可。

类似程序参见:POJ3286 How many 0‘s?

AC的C语言程序如下:

/* UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem */

#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 countdigit(LL n, int digit)
{
    LL sum=0, dgt, left, right;
    int i;
    for(i=1;;i++) {
        left = n / radix[i];
        sum += (left -((digit==0)?1:0)) * radix[i-1];
        dgt = n % radix[i] / radix[i-1];
        if (dgt > digit)
            sum += radix[i-1];
        else if(dgt == digit) {
            right = n % radix[i-1];
            sum += right + 1;
        }

        if (n < radix[i])
            break;
    }

    return sum;
}

int main(void)
{
    maketable();

    int a, b, i;

    while(scanf("%d%d", &a, &b) != EOF && a+b) {
        if(a > b) {
            int temp = a;
            a = b;
            b = temp;
        }

        for(i=0; i<=9; i++)
            printf("%lld%c", countdigit(b, i) - countdigit(a-1, i), (i==9)?'\n':' ');
    }

    return 0;
}


UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem

标签:

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

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