UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem

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;
}
时间: 2024-10-12 22:18:48

UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem的相关文章

The Counting Problem poj2282

/************************************************************************/ /* 递归问题: 给定一个区间,求其中所有0~9数字总计出现次数 思路: 设f(a),f(b)为各自从1开始到a,b中所有0~9数字总计出现次数. 则ans=f(b)-f(a-1);递归的话就是建立f(k)和f(10*k+x)的关系. 对于一个大数,先处理到末尾为0,然后再认为是从0开始10个10个数,数到这个数. 例如,f(2984)就先从298

UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。

/** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数. 思路:数位dp: dp[leadzero][i][j][k]表示前面是否选过非0数,即i长度之后可以第一个出现0,而不是前导0,长度为i,前面出现j,k次,j出现的次数. */ #include<iostream> #include<cstri

POJ2282 The Counting Problem

题意 Language:DefaultEspa?ol The Counting Problem Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5070 Accepted: 2590 Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. Your task is to calcula

HDOJ 1663 The Counting Problem 打表

先打出0~8位数,分别可以被整十/百/千/万...整除时 , 各个数字出现了几次的表 先把每要查询的数字的每一位在表里查询得到一个结果 但是这样是不全面的,考虑这样的情况: 例如2345这样的数 234* 这种情况下 4出现了5次 23**这种情况下3出现了45次 2***中2出现了345次等.....从后往前扫一遍即可 其中0的情况比较特殊,简单的扫一遍会漏掉很多可能 比如 5050时: 500*的情况下,第2个0就没有考虑到,所以还要进行一次补0的操作. 排除首位从前往后扫,遇到每一个不为0

POJ 2282 The Counting Problem,组合数学

POJ 2282 The Counting Problem,组合数学 ACM 题目地址:POJ 2282 题意: 给出俩数n,m,求从n~m中0~9分别出现的次数. 分析: 组合数学. 只要能快速算出0~n中各个数的出现次数就能解决问题了. 要把数拆开来看,比如3456=3000+400+50+6. 然后就只要考虑后面都是0的数就行了. 0~3000中,我们要分为两部分来考虑: 在第一位中,0\1\2都出现了1000次. 假设不管第一位,后面那些位数出现0~9的几率是均等的(先不考虑前导0).那

POJ 2282-The Counting Problem(组合数学_区间计数)

The Counting Problem Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2282 Appoint description:  System Crawler  (2015-04-15) Description Given two integers a and b, we write the numbers between

poj2282 The Counting Problem 数位dp

题意:给两个数l,r,求[l,r]区间内这么多数包含多少个"0" "1" "2"..."9". 比如[1 10] 除了"1"有2个,其余数字均只有1个. 思路:数的范围为1e8,又是数的统计,一看就是数位dp.设dp[ i ] [ pos ] [ cnt ]为当前考虑数字为i,且当前考虑pos位,之前的位已经 有cnt个数字i,之后(pos+1)位与之前数位组合含数字i的个数.那么除了数字"0&q

UVa1640 - The Counting Problem(数位统计)

题意: 统计两个整数a,b之间各个数字(0~9)出现的次数,如1024和1032,他们之间的数字有1024 1025 1026 1027 1028 1029 1030 1031 1032 总共有10个0,10个1,3个3等等. 分析: 因为前导0的干扰,为了计算方便暂时都先计算在内,之后再减; 如果是0~199,那么百位上的0和1各出现一次,s剩下的就是两个00~99,总共两百个二位数,而每个数出现的次数都一样,都是2*(99-00+1)/10; 那么任意的数都可以分解成类似的数字,如3426,

UVA 1640 The Counting Problem

https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int ans[10],a[10],dp[10][10],bit[10]; int dfs(int dep,int ty,bool l