数学——技巧——判断阶乘尾部有多少个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、 5、 6 、…30
(5的倍数 30/5个)
5 、10、 15、 20、 25、 30
这个数列可以提取因子5 后, 可以表示为:
5*[1、2、 3、 4、 5、 6] 这是找到了 6个因子5
对于 内部 1 、 2 、3、 4 、5 、6 这个又可一看成n==6 时, 地归寻找。
推荐——>
求n!阶乘末尾有几个0
long long found(long long n)
{
long long ans = 0;
while(n)
{
ans+=n/5;//求 n内 5的倍数个数
n/=5; // 提取因子5的操作。
}
return ans;
}
相关题目:
https://vjudge.net/problem/POJ-1426
还没有评论,来说两句吧...