当前位置: 首页 > 知识库问答 >
问题:

求阶乘中具有n个尾随零的自然数

空英逸
2023-03-14

我需要以下问题的帮助。

给定一个整数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

有人能给我一个更有效的方法来做到这一点吗?目前,一个测试用例需要30秒来询问阶乘中带有250尾随零的数字。

谢谢

共有2个答案

慎志国
2023-03-14

关注组成一个数字的2和5的数量。e、 g.150由2*3*5*5组成,有1对2

例如,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 
..   

参考彼得·德·里瓦斯和德米特里·拜琴科的评论,他们得到了一些好的建议。

东郭宏深
2023-03-14

获取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) 

为了解决这个问题(在n!n尾随零的数字),您可以使用以下事实:

  • 零的数量是单调函数:f(x a)

然后实现二进制搜索(在单调函数上)。

例如,在2500的情况下,我们有测试[4*250..5*250 ] == [1000...1250]的初始范围。二进制搜索将范围缩小为[1005...1009]

1005、1006、1007、1008、1009都是数字,它们在阶乘中正好有250个训练零

编辑如果我(2年后)证明了最后一个猜测,我希望我不会破坏乐趣(见下面的评论):

阶乘中的每个5**n乘以2**n产生10**n,因此n零;这就是为什么f(x)

f(x) = [x / 5] + [x / 25] + [x / 125] + ... + [x / 5**n] + ...

其中,[…]表示地板或整数部分(例如,[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 / 4 

或者如果y=f(x)

 类似资料:
  • 我是C编程新手,我想找出给定数的阶乘中尾随零的数量 我尝试计算数字的模,它将返回给定数字的最后一位作为余数,然后将删除最后一个数字。 执行程序后,输出总是将尾随零的数量显示为“0”,如果(ln=!0)条件始终得到满足,即使存在零。

  • 我试图解决代码战问题,称为:N的尾随零的数量!和哈斯克尔。我知道我不需要计算阶乘来知道尾随零,事实上我只是计算有多少个数字可以被5整除,以及每个数字可以被5整除多少次。我写了两个版本,一个版本在对一个数字进行去噪时使用回忆录,以得到可以被5整除的次数,另一个版本不使用回忆录。令我惊讶的是,假设的DP方法比普通的递归方法耗时更长。我可能在代码中做了一些非常愚蠢的事情。 以下是功能: 我试图记下的是默

  • 问题内容: 我正在尝试计算阶乘产生的数字的尾随零(这意味着数字变得很大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。但是,当数字大约为25!时,numZeros将不起作用。 我并不担心这段代码的效率,并且我知道有多种方法可以使这段代码的效率更好。我要弄清楚的是为什么计数大于25的数字结尾的零!不管用。 有任何想法吗? 问题答案: 您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案

  • 我试图计算给定数字的阶乘中尾随零的数量,例如。, ,其中尾随零 ,其中尾随零 我的问题是,我有一个像df这样的数据帧 我知道R中的阶乘是用来计算阶乘的,但我不知道如何计算尾部的零。任何帮助都将不胜感激!

  • 我试图计算阶乘中尾随零的数量。 我认为尾随零的数量不正确。 使用计数(30)时,30中有7个尾随的0。然而,它正在返回6。

  • 当我提交给leetcode时,它运行案例500/502,但失败了,原因是:1808548329。但当我在自己的mac上运行它时,它给出了与公认的答案相同的答案。 我的代码: 交流答案是: 它们在我的mac上运行相同的结果: 第一个解决方案之所以不被接受,是因为时间复杂度 (因为我在自己的mac上运行它,但它给出了与ac相同的答案) 如何计算第一个解决方案的时间复杂度, 它是O(NlogN)吗?我不