338. 计数问题

摘要
Title: 338. 计数问题
Tag: 数位dp
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

338. 计数问题

  • 题意

    给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼9 的出现次数。
    例如,a=1024,b=1032,则 a 和 b 之间共有 9 个数如下:
    1024 1025 1026 1027 1028 1029 1030 1031 1032
    其中 0 出现 10 次,1 出现 10 次,2 出现 7 次,3 出现 3 次等等…

  • 思路

    可以再参照这篇博客 link
    img

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    from math import log10

    def count(n, d): #求从1到数n中数d出现的次数
    len = int(log10(n) + 1) if n > 0 else 0
    res = 0
    for i in range(1, len + 1): #高位到低位
    # 求 1 <= xxxdyyy <= opqrstu 多少个xxxdyyy
    # opqrstu ex: i = 4, l = opq, r = stu, di = r
    # xxxdyyy
    p = 10 ** (len - i)
    l = n // p // 10
    r = n % p
    di = n // p % 10

    # xxx < opq
    if d:
    res += l * p
    else:
    res += (l - 1) * p
    # xxx = opq
    if di == d:
    res += r + 1
    if di > d:
    res += p
    return res

    while True:
    try:
    a, b = map(int, input().split())
    if a == 0 and b == 0:
    break
    if a > b:
    a, b = b, a
    for i in range(10):
    print(count(b, i) - count(a - 1, i), end = " ")
    print()
    except:
    break
使用搜索:谷歌必应百度