我正在解决里程表上零点的次数。每当我看到零时,我就算+1。
所以我明白了,
我用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)}"
答案 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值相加,您可以获得所需的答案。