阶乘

问题出自编程之美

问题一: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的方法见上一问

你可能感兴趣的:(阶乘)