【问题标题】:Counting digit occurrences计数数字出现
【发布时间】:2011-07-08 20:28:45
【问题描述】:

这个问题真的让我很困惑;给定两个整数 AB,我们要计算 [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

输入:

44497

输出:

85 185 185 185 190 96 96 96 95 93

【问题讨论】:

  • 你知道如何计算单个数字中出现的数字吗?
  • 我们需要更多信息。样本数据集和相应的答案会很好。您是否尝试过解决问题并遇到代码问题?如果是这样,请张贴你所拥有的。这是作业吗?像这样标记
  • 好吧,如果范围很大,这实际上很有趣。
  • 数学上你的假设是正确的。但是在计算中这是一个坏主意。想想这个例子:A=10^10^10^10 and B=10^10^10^10+1。
  • 对于1s,请参见:oeis.org/A094798 那里甚至还有 Maple 代码!

标签: algorithm math numbers digits counting


【解决方案1】:

我会先尝试蛮力方法以使某些东西起作用。查看每个数字,遍历该数字的字符串表示中的每个字符,等等。

但是,有一种更简单的方法。

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

您可以对此进行概括,并通过一些努力想出一个公式来计算某个数字(0 是可能的特殊情况)将出现在某个范围内的数量。您不需要实际检查每个数字。

【讨论】:

  • (只要注意左边出现10次,右边出现10次,共29次!)
  • 这不会有什么帮助,不是吗?您指定的范围是“特殊的”,对于某些 x,它们都等于 10 ^ x - 1。
  • @Abody97 是的,但是非常大的范围将包括很多这些特殊的范围,从而节省了大量的计算时间..
  • @Abody97 您可以在数字上递归地执行此操作。例如,对于 32554,执行 30000,然后执行 2000,然后执行 500、50、4。
【解决方案2】:

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}

【讨论】:

  • 不再那么友好了:wolframalpha.com/input/…
  • @IVlad 免费使用达到一定的门槛是友好的。为了更友好,你应该付钱给他们。代表点不允许作为比特币,对不起:)
  • 我不认为这与支付他们有关。我不太精通mathematica,但看起来它正在迭代给定范围内的每个数字并计算数字,这非常慢并且OP明确指定将不起作用。然而在这里,我们有 2 篇文章暗示了这种幼稚的方法......
【解决方案3】:

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

例如,在 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})

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多