题目
设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
挑战
O(logN)的时间复杂度
题目分析
n阶乘中,尾部出现的零是10和10的倍数相乘的结果,尾部出现多少个零,其实就是在n阶乘中有多少个10相乘,10的公因数除了1与10,就只剩下2与5,所以出现10其实是2与5相乘
因此,尾部出现的零就是5和偶数相乘的结果,在n阶乘中,偶数的个数要比5个数多得多,所以尾部零的个数就为多少个5相乘的个数(10看做2x5即一个5,25看做两个5…)
以n=100为例
1x2x3x4x5x6x7x8x9x.........x98x99x100
这些数中每5个数将会出现一个5的倍数,一共出现temp1 = 100/5 =20
5x10x15x20x25x30x......x90x95x100
我们将这些数提取出一个5
5(1x2x3x4x5....x17x18x19x20)
括号中20个数出现5的倍数的个数为temp2 = 20/5 =4
5x10x15x20
再提取5,此时括号已经没有5的倍数,即temp3 = 0
5(1x2x3x4)
所以总的个数为temp = temp1+ temp2 = 14
综上,程序循环到temp = 0时,程序结束
用C语言程序实现为
#include<stdio.h>
int main()
{
long num=0,temp;
temp = n/5;
while(temp!=0)
{
num = num+temp;
temp = temp/5;
}
return 0;
}