【编程之美】给定一个整数N,求N!末尾有多少个0

问题:给定一个整数N,求N!末尾有多少个0

         这个题目不能直接求出N!的值,这样可能会溢出。首先考虑N!=K*10^M,并且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10=2*5,所以M只和X和Z有关,每一对2和5相乘都可以得到一个10,于是M=min(X,Z);不能看出X>=Z.所以把公式简化为M=Z,只要计算出Z的值,就可以得到N!末尾0的个数。

 解法一:计算1,2,...,N的因式分解中5的指数,然后求和。
   

  1.  ret=0;  
  2. for(i=1;i<=N;i++)  
  3. {  
  4. j=i;  
  5. while(j%5==0)  
  6.   {  
  7. ret++;  
  8. j/=5;  
  9. }  
  10. }  


解法二:公式Z=[N/5]+[N/5^2]+[N/5^3]+...其中[N/5]表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的数中5^2的倍

数再贡献一个5. [N/k]表示1,2,3,...,N中能被k整除的数的个数。
代码如下:
 

  1. ret=0;  
  2.  while(N)  
  3. {  
  4.  ret+=N/5;  
  5. N/=5;  
  6. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值