问题出自编程之美
问题一:n!的末尾的0的个数
解法:
设n!素数分解后为
n!=(2^x1)*(3^x2)*(5^x3)*(7^x4)*...
显然,n!末尾0的个数只和x1,x3有关
即末尾0的个数为min(x1,x3)
于是原问题转化为了求x1和x3
求x1:
用一个例子来说明过程,设n=10
则n!=1*2*3*4*5*6*7*8*9*10
n/2=5 即2,4,6,8,10
n/4=2 即4,8
n/8=1 即8
即x1=n/2+n/4+n/8+n/16+...+0
求x3同理
问题解决,时间复杂度为log(n)
问题2:n!的二进制表示中最低位1的位置
解法:
n!素数分解后为
n!=(2^x1)*(3^x2)*(5^x3)*(7^x4)*...
显然原问题转化为求x1
求x1的方法见上一问