计算数字出现次数

时间:2011-07-08 20:28:45

标签: algorithm math numbers digits counting

这个问题让我很困惑;我们给了两个整数 A B ,我们想要计算 [A,B] 范围内的数字出现次数。我想,如果我们可以计算 [0,A] [0,B] 范围内的数字出现次数,那么其余的都是微不足道的。那么如何计算 [0,x] 范围内的数字出现次数? 这不是功课,这实际上是SPOJ的一个问题。 天真的方法是行不通的,因为A和B可以大到10 ^ 9.这里有一些例子:

输入:

1 10

输出:

1 2 1 1 1 1 1 1 1 1

输入:

44 497

输出:

85 185 185 185 190 96 96 96 95 93

3 个答案:

答案 0 :(得分:9)

我会首先尝试蛮力方法来获得一些有用的东西。查看每个数字,遍历该数字的字符串表示中的每个字符,等等。

然而,有一种更简单的方法。

  • 在区间[0,9]中,3出现1次
  • 在区间[0,99]中,3在第一位数字显示10次,在第二位数字显示10次
  • 在区间[0,999]中,第3位出现3次,第二位出现100次,第3位出现100次。

您可以对此进行概括,并通过一些努力得出一个公式,表示某个数字(0可能是特殊情况)中有多少会出现在某个范围内。您无需实际查看每个号码。

答案 1 :(得分:1)

Wolfram Alpha是你的朋友(至少在21 * 10 ^ 4附近有一些数字):

Input:

44 497

Output:

85 185 185 185 190 96 96 96 95 93 

Try Me

结果:

{85,185,185,185,188,96,96,96,95,93}

答案 2 :(得分:-1)

对于这类问题,在确定如何正确和快速地完成它之前,从一个缓慢而丑陋的实现开始通常是有用的。您可能会了解问题的结构,并且您可以使用慢速实现来测试快速实现的正确性。

例如,在Python中,您可能会编写这样的慢速版本(它不一定是最好的方法,但它是最短的......)

>>> A, B = 1, 100
>>> from collections import Counter
>>> Counter(''.join(map(str, range(A, B + 1))))
Counter({'1': 21, '3': 20, '2': 20, '5': 20, '4': 20,
         '7': 20, '6': 20, '9': 20, '8': 20, '0': 11})