Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带尾随零的阶乘,但不计算阶乘_Javascript - Fatal编程技术网

Javascript 带尾随零的阶乘,但不计算阶乘

Javascript 带尾随零的阶乘,但不计算阶乘,javascript,Javascript,我在计算阶乘的尾随零。我的解决方案是计算阶乘,然后确定它有多少个尾随零。可以想象,这不是很容易扩展的。我如何在不计算阶乘的情况下解决这个问题 我在上找到了这些页面,所以: 但是,两者都不是Javascript。如果你否决了这个问题,请告诉我原因。感谢您的时间和反馈 我的解决方案: function zeros(n) { var result = []; var count = 0; for (var i = 1; i <= n; i++) { result.push

我在计算阶乘的尾随零。我的解决方案是计算阶乘,然后确定它有多少个尾随零。可以想象,这不是很容易扩展的。我如何在不计算阶乘的情况下解决这个问题

我在上找到了这些页面,所以:

但是,两者都不是Javascript。如果你否决了这个问题,请告诉我原因。感谢您的时间和反馈

我的解决方案:

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);
}