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当前位置我编辑了答案,添加了证据