Javascript 我在新浪微博接受采访时,JS中的阶乘

Javascript 我在新浪微博接受采访时,JS中的阶乘,javascript,math,Javascript,Math,1*2*3*…*100末尾的0是多少? 例如1 0 10,2 0在10100结尾,0 0在10001 面试官给了我3分钟的时间。 前端开发实习生是我想要的工作。 我试着用JavaScript来解决这个问题,它错了,因为100!对于JS变量来说太大了。这是我的代码 var factorial = function(x){ if(x<0){ return error; }else if (x ===1 || x ===0) { return x; }else if

1*2*3*…*100末尾的0是多少?
例如
1 0 10,2 0在10100结尾,0 0在10001
面试官给了我3分钟的时间。
前端开发实习生是我想要的工作。
我试着用JavaScript来解决这个问题,它错了,因为100!对于JS变量来说太大了。这是我的代码

var factorial = function(x){
  if(x<0){
    return error;
  }else if (x ===1 || x ===0) {
    return x;
  }else if (x > 1) {
    return (factorial(x - 1) * x);
  }
}

var counter = 0;
var countZero = function(x){
  while((x%10) === 0){
    counter = counter + 1;
    x = x/10;
  }
  return counter;
}
console.log(countZero(factorial(100)));
var阶乘=函数(x){
if(x1){
收益率(阶乘(x-1)*x);
}
}
var计数器=0;
var countZero=函数(x){
而((x%10)==0){
计数器=计数器+1;
x=x/10;
}
返回计数器;
}
log(countZero(阶乘(100));

有什么想法吗?我用纯数学的方法在没有电脑的情况下解出来,但我想知道如何用JS解出来。

一个数字末尾的零是2和5相乘的结果。因此,计算零的总数的一种方法是计算出进入
100的2和5的总数-不计算该数字,只需将因子数相加-然后返回最小的计数(2或5)

设twos=0;
设五=0;

对于(设i=1;i如果一个数字的因子为10,则该数字的末尾将得到一个零。例如,10是50、120和1234567890的因子。因此,您需要了解在100的展开中,10是因子的多少倍

但由于5×2=10,我们需要考虑5和2的所有乘积。从上述展开式中的因子来看,2(2,4,6,8,10,12,14,…)的倍数比5(5,10,15,…)的倍数多得多也就是说,如果我们把所有带5的数字作为一个因子,我们将有足够多的偶数与它们配对,得到10的因子(在我的阶乘上还有一个尾随的零)。所以要找到乘以10的次数是一个因子,我们真正需要担心的是在1到100之间的所有数字中,有多少乘以5是一个因子

好的,从1到100的数字中有多少个5的倍数?有5,10,15,20,25

让我们用一种简单的方法来做:100是小于或等于100的5的最近倍数,100÷5=20,因此在1和100之间有20个5的倍数

但是等等:25是5×5,所以25的每一个倍数都有一个额外的因子5,我们需要考虑。25的多少倍数在1和100之间?因为100÷25=4,所以在1和100之间有四个25的倍数

加上这些,我们在100中得到20+4=24个尾随零

这更像是一个数学问题,而不是一个特定于Javascript的问题,您不需要计算实际的阶乘来找到尾随零的数量


对于小于或等于
100000000
的数字,您可以使用以下算法:

函数numberofzero(n){
如果(n==0)返回0;
返回parseInt(n*(n-1)/(4*n));
}

console.log(numberOfZeros(100));
返回错误;
尝试这样做将导致
引用错误
…这是一个有点愚蠢的问题,因为你必须知道一个技巧,至少我必须用谷歌搜索…@AKX是的,这是一个糟糕的面试问题。@AKX我在回家的巴士上用你的链接完全相同的方式解决了它。