算法->编程之美2.2 N!末尾有多少个0


N的阶乘末尾有多少个0

思考:0来自何方?

10*10*10*。。。乘以10就会产生0。

那么N!可以写成下面这种形式:

且K不能被10整除,那么N!的末尾就有M个0。

那么M是多少呢=>将N!进行质因数分解



需要M个2和M个5来组成M个10,N!一共有X个2,Z个5,所以M=min(X,Z);


偶数都能被2整除,都能贡献出质数2来,能被5整除的就相对就少很多。所以M=min(X,Z)=Z

=======现在问题就转化成,求N!含有质因数5的个数即Z=======

方法1:遍历1~N,sum(每个数贡献出来的5个个数)

以25!为例,25!=1*2*3*……*25,如下图所示,5,10,15,20,都贡献了5:5=5*1贡献了1个,10=5*2也贡献了一个质因数5也贡献了一个质因数2,25=5*5,贡献了2个质因数5


ret = 0;
for(int i=1;i<=N;++i){
	j = i;
	while(j % 5 == 0){//若j有质因数5
		++ret;//质因数个数加1
		j /= 5;//整除5,再循环看看还有没有质因数5了
	}
	//若j==25,那么第一次j%5判断有质因数5,则ret+1;j=25/5;
	//再循环判断是否还有质因数5,还有,则ret+1,j=5/5;
	//再循环判断是否还有质因数5,j为1,所以已经没有质因数了,while循环结束
}


方法2:利用公式

以25!为例解释公式:


如图所示,1~25个数中一共贡献了6个5.

(其中5的倍数贡献5个5,25的倍数再贡献1个5)

:1~25这25个数中有多少个5的倍数?他们至少每个贡献一个5。5、10、15、20、25加起来贡献5个5.

:1~25这25个数中有多少个25的倍数,就只有一个25是25的倍数。除去了作为5的倍数贡献出来的1个质因数5,他至少再贡献一个5。所以25再贡献一个质因数5.


代码:

ret=0
while(N){
	N/=5;
	ret+=N;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值