尝试计算给定数字的阶乘中尾随零的数量有点困难。这是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
def zeros(n)
zeros = 0
zeros += n /= 5 while n >= 1
zeros
end
所以,既然@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)
然后我做了一些重新安排,这样只会使用整数算术来计算结果。
这更像是一个数学问题。你是对的,你走错了路。(我是说你走的路会导致一个非常低效的解决方案)
首先尝试从数学上减少问题。(顺便说一句,你正在尝试对数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)吗?我不