简体   繁体   English

确定阶乘 Function 的尾随零的数量(javascript)

[英]Determine Number of Trailing Zeros of a Factorial Function (javascript)

I'm writing a function that returns the number of trailing zeros of a factorial.我正在写一个 function ,它返回一个阶乘的尾随零的数量。 It seems that the amount of zeros increases from 0, for every 5 positive increments.对于每 5 个正增量,零的数量似乎从 0 开始增加。 but also increases 1 zero for every 25 increments, The problem is that when I pass in a number like 1000, it should return 249. but it returns 240 instead?但也会每增加 25 个增量就增加 1 个零,问题是当我传入一个像 1000 这样的数字时,它应该返回 249。但它却返回 240? Am I missing something?我错过了什么吗?

I'm almost positive there is a better way to write this, but hopefully, someone can tell me what I'm missing in my current function?我几乎肯定有更好的方法来写这个,但希望有人能告诉我我目前的 function 中缺少什么?

Note: This function must not calculate the actual factorial to determine the number of trailing zeros.注意:此 function 不得计算实际阶乘以确定尾随零的数量。

 function zeros(n) { const extraZeros = n/25 const zeros = n/5 if(extraZeros >= 1) { return zeros + Math.floor(extraZeros) }else{ return Math.floor(zeros) } } console.log(zeros(0), 0); console.log(zeros(5), 1); console.log(zeros(6), 1); console.log(zeros(30), 7); console.log(zeros(60), 14); console.log(zeros(1000), 249); // missing 9 zeros?

Any help would be greatly appreciated, Thank you!任何帮助将不胜感激,谢谢!

It seems that the amount of zeros increases from 0, for every 5 positive increments.对于每 5 个正增量,零的数量似乎从 0 开始增加。 but also increases 1 zero for every 25 increments.但每增加 25 次也会增加 1 个零。

You're right, but read this sentence again.你是对的,但是再读一遍这句话。 Do you see the pattern?你看到图案了吗?

It'll also increase a zero for every 125 and 625 increments, etc. You need to generalize based on powers of 5.它还会为每 125 和 625 增量等增加一个零。您需要根据 5 的幂进行概括。

 const zeros = (n) => { let power = 1; let totalZeros = 0; while (n > 5 ** power) { totalZeros += Math.floor(n / (5 ** power)); power++; } return totalZeros; }; console.log(zeros(0), 0); console.log(zeros(5), 1); console.log(zeros(6), 1); console.log(zeros(30), 7); console.log(zeros(60), 14); console.log(zeros(1000), 249);

Another way of writing it, from Patrick Roberts:帕特里克·罗伯茨(Patrick Roberts)的另一种写法:

 const zeros = (n) => { let totalZeros = 0; for (let power = 5; power < n; power *= 5) { totalZeros += Math.floor(n / power); } return totalZeros; }; console.log(zeros(0), 0); console.log(zeros(5), 1); console.log(zeros(6), 1); console.log(zeros(30), 7); console.log(zeros(60), 14); console.log(zeros(1000), 249);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM