给定一个非负整数 n ,返回 n! 结果的末尾为 0 的数量。
n! 是指自然数 n! 的阶乘,即 : 。
特殊的, 0 的阶乘是 1 。
数据范围:
进阶:空间复杂度 ,时间复杂度
复杂度要求:
不大于
相乘会产生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的倍数...
public long thenumberof0 (long n) { // write code here // if(n==0)return 1; long count=0; while(n!=0){ count+=n/5; n=n/5; } return count; }
public long thenumberof0 (long n) { // write code here long cnt = 0; while (n != 0) { cnt += n / 5; n /= 5; } return cnt; }
public long thenumberof0 (long n) { // write code here long res=0; while(n!=0){ res+=n/5; n/=5; } return res; }