JS算法-阶乘后的零

简介: JS算法-阶乘后的零

题目


给定一个整数 n ,返回 n! 结果中尾随零的数量。

输入: n = 3
输出: 0
解释: 3! = 6 ,不含尾随 0


题解


第一种


我们用一个数组dp来记录每个数字的阶乘末尾零的个数。dp[i]表示i的阶乘末尾零的个数。我们从1开始遍历到n,对于每个i,我们计算出i5的个数,然后用dp[i-1]加上这个数,就得到了dp[i]。最后返回dp[n]即可,在这里我们需要注意的是,计算5的个数时,我们需要用while循环不断除以5,直到除不尽为止。这样可以避免重复计算

var trailingZeroes = function (n) {
  let dp = new Array(n).fill(0);
  dp[0] = 0;
  const fiveCounts = n => {
    let cnt = 0;
    while (n % 5 === 0) {
      cnt++;
      n = n / 5;
    }
    return cnt;
  }
  for (let i = 1; i <= n; i++) {
    let fives = fiveCounts(i);
    dp[i] = dp[i - 1] + fives;
  }
  return dp[n];
};


第二种


函数trailingZeroes接收一个整数n,如果n为0则直接返回0。否则,定义一个名为handler的递归函数,用来计算n的阶乘,返回值为BigInt类型。在函数中,当n等于1时返回1,否则返回n乘以handler(n-1n)的结果。这里使用BigInt类型是因为计算阶乘时很容易超出JS的计数范围,而使用BigInt可以避免这个问题,然后我们接下来,调用handler(BigInt(n))计算出n的阶乘,并将结果转化为字符串,赋值给变量result。接着,获取result的长度,用变量len记录下来。定义变量count初始化为0,用来记录末尾零的个数。从字符串的末尾开始遍历,如果当前字符是零,就将count加1;否则,跳出循环。最后,返回count即可

var trailingZeroes = function (n) {
  if (!n) return 0;
  const handler = (n) => {
    if (n === 1n) return 1n;
    return n * handler(n - 1n);
  }
  const result = handler(BigInt(n)).toString();
  const len = result.length;
  let count = 0;
  for (let i = len - 1; i >= 0; i--) {
    if (result[i] === '0') {
      count += 1;
    } else {
      break;
    }
  }
  return count;
};
相关文章
|
2月前
|
算法 JavaScript 前端开发
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(下)
至于分发?我们可以参考一下市面上已有的一些概念做一下对比,下面是笼统的一个网络服务器的TPS预估值,也就是说彩票服务器在1秒内可以处理的最大请求数:
|
2月前
|
数据采集 算法 JavaScript
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(上)
原本这篇文章是打算叫「假如我是彩票系统开发者」,但细想一下,如果在文章中引用太多的 JavaScript 的话,反而不是那么纯粹,毕竟也只是我的一厢情愿,彩票开发也不全如本文所讲,有所误导的话便也是得不偿失了。
|
1月前
|
缓存 JavaScript 算法
Vue.js中的diff算法:让虚拟DOM更高效
Vue.js中的diff算法:让虚拟DOM更高效
|
3月前
|
算法 JavaScript
|
3月前
|
算法 JavaScript
|
3月前
|
算法 JavaScript
|
3月前
|
算法 JavaScript
JS算法-二叉树的右视图
JS算法-二叉树的右视图
|
3月前
|
算法 JavaScript
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真