在新浪微博上接受我的JS阶乘

时间:2018-08-21 08:37:06

标签: javascript math

1 * 2 * 3 * .... * 100末尾有多少0?
例如
1零10,2零在10100的末尾,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)));

有什么想法吗?我不用计算机就可以用纯数学方法解决它,但是我想知道如何用JS解决它。

3 个答案:

答案 0 :(得分:0)

数字结尾处的零是2s和5s相乘的结果。因此,计算零总数的一种方法是弄清楚100!中有2和5总数-不要计算该数字,只需将数字相加即可的因素-然后返回最小的计数(2s或5s)。

let twos = 0;
let fives = 0;
for (let i = 1; i <= 100; i++) {
  let num = i;
  while (num % 2 === 0) {
    twos++;
    num /= 2;
  }
  while (num % 5 === 0) {
    fives++;
    num /= 5;
  }
}
console.log(Math.min(twos, fives));

答案 1 :(得分:0)

如果数字以10为因数,则数字的末尾为零。例如,10是50、120和1234567890的因数。因此,您需要找出10是100扩展中的因数的倍数。

但是由于5×2 = 10,我们需要考虑5和2的所有乘积。考虑到上述扩展的因素,还有更多的数字是2的倍数(2、4、6、6 8、10、12、14 ...)比5(5、10、15 ...)的倍数大。也就是说,如果我们将所有数字以5为因数,那么我们将有足够多的偶数与它们配对以获得10的因数(我的阶乘中还有一个尾随零)。因此,要找到10的倍数是一个因子,我们真正需要担心的是,在1到100之间的所有数字中,有5倍是一个因子

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

让我们简短地做一下:100是小于或等于100的5的最接近倍数,并且100÷5 = 20,所以1和100之间有20的5的倍数。

但是请等待:25是5×5,因此25的每个倍数都需要考虑5的额外因数。 1到100之间有25的多少倍?由于100÷25 = 4,因此1和100之间有25的4倍。

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

与其说是Java特定问题,不如说是一个数学问题,您无需计算实际阶乘即可找到尾随零的数量

More details here

答案 2 :(得分:0)

对于小于或等于1000000000的数字,在这里您可以使用以下算法:

function numberOfZeros(n) {
  if (n == 0) return 0;
  return parseInt(n * (n - 1) / (4 * n));
}
console.log(numberOfZeros(100));