里程表上出现零次的次数

时间:2016-07-09 22:55:41

标签: ruby algorithm math permutation

我正在解决里程表上零点的次数。每当我看到零时,我就算+1。

  • 10 - > 1
  • 100-> +2因为在100我看到2个零
  • 10004 - > +3因为我看到3个零

所以我明白了,

  • 1 - 100 - > 11
  • 1 - 500 - > 91
  • 1 - 501 - > 92
  • 0 - 4294967295-> 3825876150

我用rubydoctest。我还没有对begin_number做任何事情。任何人都可以解释如何在没有蛮力方法的情况下计算它吗?

我做了很多尝试。它们适用于10,1000,10.000,1.00000.000等数字,但不适用于522,2280这样的数字。如果我运行rubydoctest,它将在# >> algorithm_count_zero(1, 500)上失败

    # doctest: algorithm_count_zero(begin_number, end_number)
    # >> algorithm_count_zero(1, 10)
    # => 1
    # >> algorithm_count_zero(1, 1000)
    # => 192
    # >> algorithm_count_zero(1, 10000000)
    # => 5888896
    # >> algorithm_count_zero(1, 500)
    # => 91
    # >> algorithm_count_zero(0, 4294967295)
    # => 3825876150
    def algorithm_count_zero(begin_number, end_number)
      power = Math::log10(end_number) - 1
      if end_number < 100
        return end_number/10
      else
        end_number > 100
        count = (9*(power)-1)*10**power+1
      end
      answer = ((((count / 9)+power)).floor) + 1
    end

end_number = 20000
begin_number = 10000
puts "Algorithm #{algorithm_count_zero(begin_number, end_number)}"

2 个答案:

答案 0 :(得分:1)

正如评论中所注意到的,这与另一个问题重复,其中解决方案为您提供了正确的指导。

但是,如果您想测试自己的解决方案的正确性,我会在这里使用并行数组处理语言 Dyalog APL (这是我的顺便说一句)认为每个人都应该使用数学和数字建模。)

使用 tryapl.org ,您可以获得任何整数值的正确答案作为参数。 Tryapl是一个带有后端的网页,后端执行简单的APL代码语句(&#34; one-liners&#34;,这是APL语言非常典型,而且代码非常紧凑)。

APL单线在这里:

{+/(c×1+d|⍵)+d×(-c←0=⌊(a|⍵)÷d←a×+0.1)+⌊⍵÷a←10*⌽⍳⌈10⍟⍵} 142857

将其复制并粘贴到tryapl.org的编辑行中,然后按回车键 - 您将很快看到一个整数,这是您的问题的答案。在上面的代码行中,您可以看到最右边的参数;这次是142857但您可以将其更改为任何整数。

由于您已经粘贴了一次一行,并使用Enter一次执行,因此将其恢复为编辑的最简单方法是按[向上箭头]。这将返回最近输入的语句;然后你可以编辑最右边的数字(在大括号之后)并再次按Enter键以获得不同参数的答案。

在上面粘贴代码行将返回66765 - 142857存在许多零。

如果在下面粘贴这2个字符的较短行,您将看到结果的各个组成部分 - 这些组件的总和构成了最终结果。您将能够看到一种模式,这可能使您更容易理解会发生什么。

试试例子

      {(c×1+d|⍵)+d×(-c←0=⌊(a|⍵)÷d←a×+0.1)+⌊⍵÷a←10*⌽⍳⌈10⍟⍵} 1428579376

0 100000000 140000000 142000000 142800000 142850000 142857000 142857900 142857930 142857937

...并从左侧开始查看中间结果如何包含参数1428579376的段!中间结果与参数中的数字一样多(这次是10次)。

1428579376的结果为1239080767,即。上面10个数字的总和。这多个零出现在1到1428579376之间的所有数字中: - )。

答案 1 :(得分:0)

分别考虑每个里程表位置。从最右边开始的位置x位置每10 ^ x次改变一次。通过查看右边的数字,您知道在下一次更改之前它将持续多长时间。然后它会在更改之前保持每个值10 ^ x次,直到它到达您正在考虑的范围的末尾,此时它将保持其当时值的某些次数,您可以根据非常结束。

现在你有一个x ... 0123456789012 ... y形式的序列,你知道长度,你知道x和y的值。计算此序列中0(或任何其他数字)的数量的一种方法是将前缀从x ..剪切到恰好在前0之前,并从最后9到y之后剪切后缀。在此后缀中查找0s n,并测量从前缀到后缀的长序列的长度。这将是一个可被10整除的长度,并且每个数字将包含相同的次数。

基于此,您应该能够针对每个位置计算出它在10个可能值中的每个值的范围内的频率。通过将每个里程表位置的0值相加,您可以获得所需的答案。