求出n的阶乘,并将该结果通过一次while循环判断,若n%10==0,count++,并将n/=10,退出循环后返回count的值即可。这种方式虽然容易理解,但对于较大的n而言,求出阶乘的结果可能就会发生上溢,因此这种方法不可行。
尾数中含有0表示该阶乘结果可以被10整除,10又可以分解成5*2,而因数5的个数相比于因数2要更少,所以每出现一个因数5总有对应的因数2与其相匹配,使末尾多出一个0,故统计因数中含有5的个数即可统计出n阶乘末尾有多少个零。而对于5的幂次如25,125,625...等因数,一个因数中可能会包含多个5,所以需要通过循环来统计该数中含有的5的个数。
int trailingZeroes(int n){
int count=0;
while(n){
count+=n/5;
n/=5;
}
return count;
}
例:
n=15,含有因数5的因数有5、10、15,此时因数中没有5的幂,循环结束,返回3
n=25,含有因数5的因数有5、10、15、20、25,count在第一次循环时加5,n赋值为5,进入下次循环,count仍要加1,因为25中含有两个因数5,有一个已经在第一次循环加上,所以只需要再加1,最后返回count=6;
n=100,初次循环,count+=20;n=20;对于这20个含有5的因数可以写成5*(1、2、3......20),而这20个数中又可以找到4个包含两个因数5的数,则count+=4;n=4;即(25、50、75、100)=5*5*(1、2、3、4),此时所有的因数5均统计完毕,循环结束时返回count=24。
对于求n阶乘末尾含有0的个数,可以转化为求因数中5的个数的方法来解决问题,这种算法的时间复杂度为O(logn),对于较大的数也可以正确的求出,相比于暴力解法,大大的提高了执行效率。谨以此篇博客记录我的收获,希望以后能学到更多巧妙的方法。