观察一下10以内的数字互相乘,会发现,只有
相乘会产生0,而且 ,
...
所以我们只需要看一下 以内 能拆出多少对
然后我们可以发现,有5因子的数比有2因子的数要少,所以我们就看能拆出来多少5就可以了,因为肯定能有足够数量的因子2来匹配。
所以阶乘末尾0的数量就是 中能拆出来的5的数量。但是,从 1 遍历到 n 每个数看一下它能除多少次 5 是不行的。因为 n 的数据范围是1e18。遍历1e18个数复杂度太大了。
那我们来考虑一下,5的倍数可以至少产生1个5,25的倍数可以产生至少2个5,125的倍数可以产生至少3个5...
这样的话 中有n/5个5的倍数,n/25个25的倍数,n/125个125的倍数...
所以答案就是 n/5+n/25+n/25...
c++
class Solution {
public:
long long thenumberof0(long long n) {
long long ans = 0;
long long d = 5;
while(n>=d)
{
ans+=n/d;
d = d*5;
}
return ans;
}
};
java
import java.util.*;
public class Solution {
public long thenumberof0 (long n) {
long ans = 0;
long d = 5;
while(n>=d)
{
ans+=n/d;
d = d*5;
}
return ans;
}
}
python
class Solution:
def thenumberof0(self , n ):
ans = 0
d = 5
while n>=d:
ans+=n//d
d = d*5
return ans

京公网安备 11010502036488号