数学——技巧——判断阶乘尾部有多少个0

对于n的阶乘, 末尾有多少个0
一、朴素做法:

朴素做法就是求出n!。然后每次对10去摸, 再除以10。

就比如5
5! = 120;

fac = 5!
ans = 0;
while(1)
{
	if(fac%10 == 0)ans++;
	else break;
	fac/=10;
}

这种做法的弊端是, n不能太大, n太大 n的阶乘无法储存。

二、

想一下n!阶乘末尾的0取决于什么?

对于每个结尾的 0 都是10 导致的, 对10进行质因子分解2*5。

这里先举个栗子。
比如5的阶乘 == 120。 
就可以看成12 *10 —— 12*5*2

所以只要统计 (1~n)中因子2和因子5的个数。
然后再取小, 就是 n的阶乘末尾0的个数。

因为(1~n)内因子2个数肯定大于 因子5个数。

所以问题就转换为(1~n)内因子5的个数。

如何求(1~n)因子5的个数。

要知道因子5一定来自与它的倍数。

所以首先要知道n内5的倍数有多少个,
n内5的倍数数量 == n/5, 这里是整除。

就比如n == 30:

1、 2、 3、 4、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值