算法小记:n的阶乘(n!)末尾有多少个0

n的阶乘(n!)末尾有多少个0?

代码实现非常简单!!!---- n!的末尾有count个0.

int n; // n!的末尾有count个0.
int count = 0;
        for (int i = 0; i < n; i++) {
            n /= 5;
            count += n;
        }

由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了。

首先,为什么末尾会有0?因为2 * 5 = 10,0就这么来了。所以只要求出这N!中有多少个2多少个5相乘就好了,由于N! = 1 * 2 * 3 *… * N,而每经过两个数就会有一个2,所以2的出现次数肯定是大于5的,因此只要求有多少个5相乘就好了。

即:n的阶乘(n!)末尾有多少个0? →  n的阶乘(n!)含有多少个因子5

因为求的是N的阶乘,而 N! = 1 * 2 * 3 * … * N

那么:这N个数中能被5整除的个数 = N / 5

比如N = 50 ,能被5整除的有 5 10 15 20 25 30 35 40 45 50 共10个,即50/5=10

但别忘了25和50,他们可拆分成55和55*2,也就是他们含有两个因子“5”,以此类推5的m次方会含有m个5作为因子

所以50!末尾有10+2=12个“0”。

所以要求一个数n!末尾有多少个0

可以利用上述循环

int n; // n!的末尾有count个0.
int count = 0;
        for (int i = 0; i < n; i++) {
            n /= 5;
            count += n;
        }

第一轮 用 n/5 (整数除法运算)得到1-n中含有因子5的整数的个数。 然后 count += n;

第二轮 再用 n/5 经历过第一轮,实际上此轮相当于 n/25
 即含有25作为因子的个数,虽然含有25作为因子的整数含有两个因子5应该加两次
 但是含有25的整数必然含有因子5,在第一轮已经计算过一次了,所以这轮每个含有25的整数只需计算一次

第n轮 以此类推,n持续除以5,直到除至含有5的最高次幂的因数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值