Algorithm 寻找阶乘中有n个尾随零的自然数

Algorithm 寻找阶乘中有n个尾随零的自然数,algorithm,python-2.7,factorial,trailing,Algorithm,Python 2.7,Factorial,Trailing,我需要帮助解决以下问题 给定一个整数m,我需要找到正整数n和整数的数目,使得n的阶乘正好以m零结束 我写了这段代码,它工作得很好,我得到了正确的输出,但是随着数字的增加,它花费了太多的时间 a = input() while a: x = [] m, n, fact, c, j = input(), 0, 1, 0, 0 z = 10*m t = 10**m while z - 1: fact = 1 n = n + 1 for i in range(1, n

我需要帮助解决以下问题

给定一个整数
m
,我需要找到正整数
n
和整数的数目,使得
n
的阶乘正好以
m
零结束

我写了这段代码,它工作得很好,我得到了正确的输出,但是随着数字的增加,它花费了太多的时间

a = input()

while a:
 x = []
 m, n, fact, c, j = input(), 0, 1, 0, 0
 z = 10*m
 t = 10**m

 while z - 1:
  fact = 1
  n = n + 1   

  for i in range(1, n + 1):
     fact = fact * i

  if fact % t == 0 and ((fact / t) % 10) != 0:
     x.append(int(n))
     c = c + 1

  z = z - 1

 for p in range(c):
  print x[p],

 a -= 1
 print c
有人能给我建议一个更有效的方法吗。目前,一个测试用例要求在其阶乘中有
250个
尾随零的数字需要30秒


谢谢

请关注组成一个数字的2和5的数量。e、 g.150由2*3*5*5组成,有一对2和5,因此有一个尾随零。每次增加测试的数字时,试着计算数字中有多少是2和5。从这一点,加上以前的结果,你可以很容易地知道它的阶乘包含多少零

例如,15=15*..*5*4*3*2*1,从2开始:

Number   2s  5s  trailing zeros of factorial
2        1   0   0
3        1   0   0
4        2   0   0
5        2   1   1
6        3   1   1
...
10       5   2   2
...
15       7   3   3
..
24      12   6   6
25      12   8   8   <- 25 counts for two 5-s: 25 == 5 * 5 == 5**2
26      13   8   8 
..   
阶乘的尾随零个数
2        1   0   0
3        1   0   0
4        2   0   0
5        2   1   1
6        3   1   1
...
10       5   2   2
...
15       7   3   3
..
24      12   6   6

25 12 8关注组成一个数字的2和5的数量。e、 g.150由2*3*5*5组成,有一对2和5,因此有一个尾随零。每次增加测试的数字时,试着计算数字中有多少是2和5。从这一点,加上以前的结果,你可以很容易地知道它的阶乘包含多少零

例如,15=15*..*5*4*3*2*1,从2开始:

Number   2s  5s  trailing zeros of factorial
2        1   0   0
3        1   0   0
4        2   0   0
5        2   1   1
6        3   1   1
...
10       5   2   2
...
15       7   3   3
..
24      12   6   6
25      12   8   8   <- 25 counts for two 5-s: 25 == 5 * 5 == 5**2
26      13   8   8 
..   
阶乘的尾随零个数
2        1   0   0
3        1   0   0
4        2   0   0
5        2   1   1
6        3   1   1
...
10       5   2   2
...
15       7   3   3
..
24      12   6   6

25 12 8 8以获得
n的尾随零的数量您可以高效地将

def zeroes(value):
    result = 0;

    d = 5;

    while (d <= value): 
        result += value // d; # integer division
        d *= 5;

    return result; 

...

# 305: 1234! has exactly 305 trailing zeroes 
print zeroes(1234) 
其中,
[…]
表示地板或整数部分(例如,
[3.1415926]==3
)。让我们执行简单的操作:

f(x) = [x / 5] + [x / 25] + [x / 125] + ... + [x / 5**n] + ... <= # removing [...]
        x / 5  +  x / 25  +  x / 125  + ... +  x / 5**n  + ... =
        x * (1/5 + 1/25 + 1/125 + ... + 1/5**n + ...) =
        x * (1/5 * 1/(1 - 1/5)) =
        x * 1/5 * 5/4 =
        x / 4

f(x)=[x/5]+[x/25]+[x/125]+…+[x/5**n]+ 获取
n!的尾随零数您可以高效地将

def zeroes(value):
    result = 0;

    d = 5;

    while (d <= value): 
        result += value // d; # integer division
        d *= 5;

    return result; 

...

# 305: 1234! has exactly 305 trailing zeroes 
print zeroes(1234) 
其中,
[…]
表示地板或整数部分(例如,
[3.1415926]==3
)。让我们执行简单的操作:

f(x) = [x / 5] + [x / 25] + [x / 125] + ... + [x / 5**n] + ... <= # removing [...]
        x / 5  +  x / 25  +  x / 125  + ... +  x / 5**n  + ... =
        x * (1/5 + 1/25 + 1/125 + ... + 1/5**n + ...) =
        x * (1/5 * 1/(1 - 1/5)) =
        x * 1/5 * 5/4 =
        x / 4

f(x)=[x/5]+[x/25]+[x/125]+…+[x/5**n]+。。。因为你总是有多于5的2,你可能只需要数一数5,是的,你可能是对的。我会在我的回答中参考你的评论。不要忘记数到
25
两次,
125
三次,一般情况下
5**n
-
n
timesTest:
1005!。。1009!
250
尾随零感谢快速响应,(事实/t)%10,我将5s和2s作为10=5*2,这使我不用检查5^n,…但是阶乘部分使程序变慢。因为你总是有2个多于5个,你可能只需要数数5个,是的,你可能是对的。我会在我的回答中参考你的评论。不要忘记数到
25
两次,
125
三次,一般情况下
5**n
-
n
timesTest:
1005!。。1009!
250
尾随零感谢快速响应,(事实/t)%10,我已将5s和2s作为10=5*2,这使我免于检查5^n,…但阶乘部分使程序变慢。你能给我一些提示为什么
x>=y*4
?无法证明@德米特里Bychenko@fardinabir当前位置我已经编辑了答案,我已经添加了校对您能给我一些提示为什么
x>=y*4
?无法证明@德米特里Bychenko@fardinabir当前位置我编辑了答案,添加了证据