我接受一个整数值,找到该值的阶乘,并尝试计算尾随零的数量(如果存在)。例如:
def zeros(n):
import math
factorial = str(math.factorial(n))
zeros_lst = [number if number == "0" (else) for number in factorial[::-1]]
return len(zeros_lst)
" else"在括号中是问题发生的地方。如果它遇到一个不为零的数字,我想离开循环。我试着像往常一样使用休息,然后查找一些例子,但没有发现任何相似之处。
如果有人知道如何摆脱列表理解,或者甚至可能会很好。我相信有更好的方法来解决这个问题,如果你这样做,请发帖。
答案 0 :(得分:0)
列表推导中没有“突破”,但还有其他一些技巧,例如: itertools.takewhile
在满足条件时迭代迭代:
>>> from itertools import takewhile
>>>
>>> values = [7, 9, 11, 4, 2, 78, 9]
>>> list(takewhile(lambda x: x > 5, values))
[7, 9, 11]
在你的情况下(如果它遇到一个非零的数字我想离开循环):
zeros_lst = list(takewhile(lambda x: x=="0", factorial[::-1]))
答案 1 :(得分:0)
如果有人知道如何摆脱列表理解
您不能破坏列表压缩。
但您可以使用if
循环中的for
条件修改列表理解。使用if,您可以决定列表中需要哪些值:
def zeros(n):
import math
factorial = str(math.factorial(n))
# Check this line
zeros_lst = [number for number in factorial[::-1] if number == '0']
return len(zeros_lst)
最好使用简单的for
循环。事实上,就性能而言,循环比列表理解更快。检查HERE我为另一个问题做的比较。
即使列表理解应该是首选,因为它们干净且可读性更高。同样,它基于意见:可读性V / S速度。
<强>建议强>:
此外,还有一种更简单的方法来实现您的目标:
import math
def find_zeros_in_factorial(n):
num_str = str(math.factorial(n))
return len(num_str)-len(num_str.rstrip('0'))
这里的想法是在末尾用字符串的长度减去的长度减去字符串的长度。
答案 2 :(得分:0)
这个问题的数学方法更加简单,易于实现。我们只需要计算因子(n)中有多少个因子。我们有超过2的因子,所以我们选择计算因子5.它看起来不干净,但它避免了因子的计算。该算法考虑了额外因子5,显示数字,如25,50,125和其他所有数据。
def find_zeros_in_factorial(n):
factors_of_5 = [n/5]
while factors_of_5[-1] > 0:
factors_of_5.append(factors_of_5[-1]/5)
return sum(factors_of_5)
答案 3 :(得分:0)
这是一个计算零的函数,你只需要传递它的数字即可。这样可以保存以前的字符串操作。一旦没有更多的尾随零,它将终止。
def count_zeros(n):
n_zeros = 0;
while True:
if n%10 == 0:
n = n/10
n_zeros+=1
else:
return n_zeros
print(count_zeros(math.factorial(12)))