2016-11-16 33 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)を使用している場合

、そこには30に0年代の末尾の7しかしそれは6

+0

i = 25の反復で末尾のゼロの数はどうなりますか? – PeteyPii

+0

25に2つの5があり、1つは説明されていません –

+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がx> = iの間はループしている間は基本的に行い、 'zeros + = 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

2つの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 
関連する問題