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解决它。
答案 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特定问题,不如说是一个数学问题,您无需计算实际阶乘即可找到尾随零的数量
答案 2 :(得分:0)
对于小于或等于1000000000
的数字,在这里您可以使用以下算法:
function numberOfZeros(n) {
if (n == 0) return 0;
return parseInt(n * (n - 1) / (4 * n));
}
console.log(numberOfZeros(100));