Javascript 带尾随零的阶乘,但不计算阶乘
我在计算阶乘的尾随零。我的解决方案是计算阶乘,然后确定它有多少个尾随零。可以想象,这不是很容易扩展的。我如何在不计算阶乘的情况下解决这个问题 我在上找到了这些页面,所以: 但是,两者都不是Javascript。如果你否决了这个问题,请告诉我原因。感谢您的时间和反馈 我的解决方案:Javascript 带尾随零的阶乘,但不计算阶乘,javascript,Javascript,我在计算阶乘的尾随零。我的解决方案是计算阶乘,然后确定它有多少个尾随零。可以想象,这不是很容易扩展的。我如何在不计算阶乘的情况下解决这个问题 我在上找到了这些页面,所以: 但是,两者都不是Javascript。如果你否决了这个问题,请告诉我原因。感谢您的时间和反馈 我的解决方案: function zeros(n) { var result = []; var count = 0; for (var i = 1; i <= n; i++) { result.push
function zeros(n) {
var result = [];
var count = 0;
for (var i = 1; i <= n; i++) {
result.push(i);
} //generating range for factorial function
var factorial = result.reduce(function(acc, el) {
return acc * el;
}, 1); //calculating factorial
factorial = factorial.toString().split('');
for (var j = factorial.length - 1; j > 0; j--) {
if (parseInt(factorial[j]) === 0) {
count += 1;
} else {
break;
}
} //counting trailing zeros
return count;
}
函数零(n){
var结果=[];
var计数=0;
对于(var i=1;i 0;j--){
if(parseInt(阶乘[j])==0){
计数+=1;
}否则{
打破
}
}//计算尾随的零
返回计数;
}
知道一个数字的尾随零的数量可以归结为知道它可以被10除多少次,即被5和2除多少次
使用非常容易计数的阶乘数:
f! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16. ... .f
^ ^ ^
标记因子5进入最终产品的位置。很明显,因子2的出现频率更高,因此因子5的计数决定了尾随零的数量
现在,当因子25出现时,它应该被计算为2;同样地,125应该算作5的3个因子,以此类推
你可以用这样的循环来覆盖它:
function zeros(n) {
var result = 0;
while (n = Math.floor(n / 5)) result += n;
return result;
}
您实际上不需要计算阶乘积来计算尾随的零 下面是一个示例,用于计算n中的尾随零数
temp = 5;
zeroes = 0;
//counting the sum of multiples of 5,5^2,5^3....present in n!
while(n>=temp){
fives = n/temp;
zeroes = zeroes + fives;
temp = temp*5;
}
printf("%d",zeroes);
请注意,阶乘乘积中5的每一个倍数都会使尾随零的数量增加1。除此之外,25的每一个倍数都会使尾随零的数量增加1。然后,125的每一个倍数将对尾随零的数量贡献另一个1,依此类推
这里有一个很好的链接来理解这背后的概念:我在这里的某个地方遇到了这个算法,现在记不起来了,但它看起来像这样
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
这非常有效,因为它不需要循环
您可以进一步优化它,使其看起来像这样
def zeros(n)
return 0 if n.zero?
n*(n-1)/(4*n)
end
这将是一个javascript翻译
function zeros(n) {
if (n == 0) return 0;
return n * (n-1)/(4*n);
}
请注意,该算法在大约
n>=100000000
之前是正确的,在这种情况下,返回值的误差范围为+1
,并且每n*10000
该误差范围就会增加+1
,当然,将C代码转换为JavaScript是很简单的。事实上,您只需将函数中的第一个int
更改为function
,将函数中的其余int
更改为var
,它就可以作为JavaScript运行。@JJJ我对C一无所知,我不知道它们有那么相似。谢谢你!
function zeros(n) {
if (n == 0) return 0;
return n * (n-1)/(4*n);
}