2016-11-16 46 views
1

我試圖計算一個階乘中的尾隨零的數量。Python,計算一個階乘中的尾隨零

def count(x): 
    zeros = 0      
    for i in range (2,x+1): 
     print(i) 
     if x > 0: 
      if i % 5 == 0:  
       print("count")  
       zeros +=1  
     else: 
      ("False") 
    print(zeros)   

count(30) 

我認爲尾部零的數量不正確。

當使用count(30),有7尾隨30 0的但是它返回6.

+0

在i = 25的迭代中,尾隨零的數量會怎樣? – PeteyPii

+0

25中有兩個5s,其中一個是下落不明 –

+0

這個程序實際上只是計算'n // 5'嗎? –

回答

1
def count (x): 
    i = 5 
    zeros = 0 
    while x >= i: 
     zeros += x // i 
     i *= 5 
    return zeros 

print(count(30)) 
+0

這工作表示感謝,如果它不是一個問題,你能解釋一下你的代碼嗎? –

+1

這個鏈接可以幫助http://www.mytechinterviews.com/how-many-trailing-zeros-in-100-factorial基本上在while循環中做,只要x> = i,'零+ = x // i'是這個'5的數量= 100/5 + 100/25 + 100/125 + ... = 24(僅限整數值)',然後乘以5得到5的下一個倍數:) –

+0

全部變得清晰了!謝謝,我的朋友。它花了我一段時間,我的腦子疼,但我終於明白 –

0

你的算法有問題:

import math 

def count_zeroes(x): 
    zeroes = 0 
    if x <= 0: 
     return zeroes 
    for i in range(5, x+1, 5): 
     for base in range(int(math.log(i, 5)), 0, -1): 
      if i % pow(5, base) == 0: 
       zeroes += base 
       break 
    return zeroes 
+0

兩個for循環效率不高。 –

3

維基百科有一個short article在這個特定的主題,這可以通過計算因子5的直接總和來計算。

def trailing_zeros_of_factorial(n): 
    assert n >= 0, n 
    zeros = 0 
    q = n 

    while q: 
     q //= 5 
     zeros += q 

    return zeros 

# 32! = 263130836933693530167218012160000000 
print(trailing_zeros_of_factorial(32)) # => 7