阶乘后的零
计算尾随0的个数,要想结果等于0,至少是2*5这种,再往上就分别是2和5的倍数可以达到这样的效果。本题化简一下:求的是含有2和5这两个因子的个数,一对2 * 5可以得到一个0。
举例:8! 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
2、4、6、8都含有因子2
只有5含有因子5,所以最后得到的结果只有一个尾随0
再者可以发现,5的因子占少数,所以本题最终求的是含有5的因子的个数
5、10、15、20、25、30……都含有因子5
这里面需要注意的是有些数含有两个因子5,如25,甚至3个因子5,如125……
含有1个因子5:5、10、15、20、25、30…… n/5(每隔五个数来一次)
含有2个因子5:25、50、75、100、125…… n/25
含有3个因子5: 125、250、375…… n/125
25、50后面这些多因子的在前面含有一个个因子的时候就被算进去了一次
125、250在前面被算进去两次了
所以大概的近似为n/5 + n/25 + n/125 ……
递归:f(n) = n/5 + f(n/5)
方法一:递归
再加一个最后递归结束的条件n<5即可
int trailingZeroes(int n) {
if(n<5)
return 0;
return n/5 + trailingZeroes(n/5);
}
这里面有 ‘ / '的特性,如果n=6,只含有一个因子5,尾速0为1,且正好6/5为1
方法二:循环
int trailingZeroes(int n) {
int i;
int res = 0;
//每次只加5,碰到含有多个因子5的需要进一步统计
for(i=5;i<=n;i+=5)
{
int j;
for(j = i;j % 5==0;j/=5)
{
res++;
}
}
return res;
}