编程之美--不要被阶乘吓倒

22 篇文章 0 订阅

问题描述:

1. 给定一个整数N,那么N的阶乘N!末尾有几个0?

2. 求N!的二进制表示中最低位1的位置。

问题1思路和问题2思路一样,一个是求含有5的个数,一个是求含有2的个数。

问题1思路:

书中写到:

一个数 N! = 2x x 3y x 5z…每对2和5相乘都可以得到一个10,于是可以转换为求min(x, z)。显然2出现的次数要比5高,所以只要求有多少个5即可。

求5的个数可以有两种方法:

1. 把N!从1到N的每个数遍历一遍,算出每个数有多少个5组成。

代码如下:

ret = 0;
for(i = 1; i < N ; i++)
{
      j = i;
      while(j % 5 == 0)
      {
              ret++;
              j /= 5;  
       }
}

2. 用N 分别除以5, 5的平方, 5的三次方知道除得0;

ret = 0;
while(N)
{
         ret += N / 5;
         N /= 5;
}
上解法2的证明可用一个例子来说明

1   2    3     4       5     6    7   8   9  10   11  12    13   14   15   16   17  18  19  20  21    23    24    25    26   27

求16! 中5的个数。

首先先求5的一次方的个数。可以得出有 5     10   15   20    25    五个数

再求5的二次方的个数。可以得出有 25一个数。原因在于25 可以分解为5x5。如果仅仅经过第一步,那只得到分解后的一个5,而没有得到第二个5。经第二步才能得到第二个5.

再顺序求下去,知道除以5的x次方商为0时止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值