阶乘

来源:互联网 发布:2017年9月份经济数据 编辑:程序博客网 时间:2024/04/28 23:33

问题出自编程之美

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

0 0
原创粉丝点击