题目
给定一个整数
n,返回n!结果中尾随零的数量。
输入: n = 3
输出: 0
解释: 3! = 6 ,不含尾随 0
题解
第一种
我们用一个数组
dp来记录每个数字的阶乘末尾零的个数。dp[i]表示i的阶乘末尾零的个数。我们从1开始遍历到n,对于每个i,我们计算出i中5的个数,然后用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;
};
坚持努力,无惧未来!