阶乘

问题出自编程之美

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值