从[1,2,.... num]计算0的数量

时间:2013-12-16 15:17:20

标签: python algorithm math

我们得到一个大数'num',最多可以有10 ^ 4位数(num <= 10 ^(10000)),我们需要从1开始查找十进制表示中的零个数upto'num'。

eg: 
countZeros('9') = 0
countZeros('100') = 11
countZeros('219') = 41

我能想到的唯一方法就是做蛮力,这对于大输入来说显然太慢了。

我在this链接中找到了以下python代码,它在O(L)中需要,L是'num'的长度。

def CountZeros(num):
    Z = 0
    N = 0
    F = 0
    for j in xrange(len(num)):
        F = 10*F + N - Z*(9-int(num[j]))
        if num[j] == '0':
            Z += 1
        N = 10*N + int(num[j])
    return F

我无法理解它背后的逻辑......任何一种帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

from 0 - 9 : 0 zeros
from 10 - 99: 9 zeros ( 10, 20, ... 90)

--100-199 explained-----------------------
100, 101, ..., 109 : 11 zeros (two in 100)
110, 120, ..., 199:  9 zeros (this is just the same as 10-99) This is important
Total: 20
------------------------------------------

100 - 999: 20 * 9 = 180 

total up to 999 is: 180 + 9: 189
CountZeros('999') -> 189 

继续这种模式,你可能会开始看到整体模式,最终看到算法。

答案 1 :(得分:0)

以下内容是否有助于您理解:

>>> for i in range(10, 100, 10):
...     print(CountZeros(str(i)))
... 
1
2
3
4
5
6
7
8
9
>>> 

这个怎么样:

>>> CountZeros("30")
j Z N F
0 0 0 0

j Z N F
0 0 3 0

j Z N F
1 0 3 0

j Z N F
1 1 30 3

3