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

给定数的阶乘中尾随零的数量-Ruby

薛博赡
2023-03-14

尝试计算给定数字的阶乘中尾随零的数量有点困难。这是Codewars-无法让我的通过的挑战之一。

zeros(12) = 2       #=> 1 * 2 * 3 .. 12 = 479001600 

我想我在这里走错了路,可能还有更优雅的红宝石路。这是我迄今为止所做的。

def zeros(n) 
    x = (1..n).reduce(:*).to_s.scan(/[^0]/)
    return 0 if x == [] 
    return x[-1].length if x != [] 
end

共有3个答案

颛孙森
2023-03-14
def zeros(n)
    zeros = 0
    zeros += n /= 5 while n >= 1
    zeros
end
向嘉誉
2023-03-14

所以,既然@Spunden如此巧妙地泄露了秘密,这里有一种实现它的方法。

密码

def zeros(n)
  return 0 if n.zero?
  k = (Math.log(n)/Math.log(5)).to_i
  m = 5**k
  n*(m-1)/(4*m)
end

示例

zeros(3)   #=>  0
zeros(5)   #=>  1
zeros(12)  #=>  2
zeros(15)  #=>  3
zeros(20)  #=>  4
zeros(25)  #=>  6
zeros(70)  #=> 16
zeros(75)  #=> 18
zeros(120) #=> 28
zeros(125) #=> 31

解释

假设n=128。

然后,1和128之间的每个数字(包括)可以被5^1整除=

128/5 + 128/25 + 128/125 #=> 31

(注意,对于具有三个因子(5)的125,在这三项中各计算一个;对于具有两个因子(5)的25、50等,在第一项中各计算一个。)

对于任意n,我们首先计算最高功率k,其中:

5**k <= n

即:

k <= Math.log(n)/Math.log(5)

因此,最大值为:

k = (Math.log(n)/Math.log(5)).to_i

正如@spundun所指出的,您也可以通过简单的迭代来计算k,例如。,

last = 1
(0..1.0/0).find { |i| (last *= 5) > n }

因此,五个因子的总数为

(n/5) + (n/25) +...+ (n/5**k)

定义:

r = 1/5,

这笔款项被视为:

n * s

哪里

s = r + r**2 +...+ r**k

s的值是几何级数项的总和。我忘记了这个公式,但回想一下它是如何推导出来的:

s  = r + r**2 +...+ r**k
sr =     r**2 +...+ r**(k+1)

s-sr = r*(1-r**k)

s = r*(1-r**k)/(1-r)

然后我做了一些重新安排,这样只会使用整数算术来计算结果。

谭骏
2023-03-14

这更像是一个数学问题。你是对的,你走错了路。(我是说你走的路会导致一个非常低效的解决方案

首先尝试从数学上减少问题。(顺便说一句,你正在尝试对数N阶算法。)

在我的回答中,我将尝试跳过几个步骤,因为这似乎是一个家庭作业问题。

尾随零的数量将等于序列乘法中5s的总幂。

1和n之间的数字将分别为5s、25s和125s的倍数。。。等等

试着接受这些提示,并想出一个算法来计算该阶乘中会塞进多少次幂。

我决定在下面详细解释一下,如果你想自己解决这个问题,那就别读了,试着想想,然后回到这里。

下面是问题的逐步简化

一个数字中尾随零的数量相当于该数字因子中10的幂

例如

  • 40=4*10^1,并且它有一个尾随零

因子中10的数字幂与因子中2的幂和5的幂的最小值相同

例如

  • 因此,最小功率为1

在任何阶乘中,2的幂将比5的幂多得多

例如

  • <代码>5!=2^3*3^1*5^1
  • <代码>10!=2^8*3^4*5^2*7^1

正如你所见,2的幂开始增加得更快,所以5的幂将是这两个中的最小值。

因此,我们需要做的就是在阶乘中计算5的幂。

现在让我们关注5在任意<代码>n中的幂

  • <代码>4!~5^0
  • <代码>5!~5^1(最多9个)
  • <代码>10!~5^2(最多14个)
  • <代码>15!~5^3(最多19!)
  • <代码>20!~5^4(最多24个)
  • <代码>25!~5^6(注意从5^4跳到5^6,因为数字25加了两个5的幂)

我想计算阶乘中五的总幂的方法是。。。计算所有5的倍数,它们都加上5的一次幂。然后计算所有25的倍数,它们都会增加5的额外幂。注意25加了两个5的幂,所以我可以把它写成,一个幂是5的倍数,一个额外的幂是25的倍数。然后计算阶乘中125(5^3)的所有倍数,再加上另一个5的幂。。。等等

那么你是如何把它作为一种算法的呢?

假设数字是n。因此...

  • pow1=n/5(四舍五入为整数)

等等

现在总功率pow=Pow1 POW2 POW3...

现在你能把它表达成一个循环吗?

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

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

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

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

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

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