一、题目描述
题目网址:http://class.51nod.com/Challenge/Problem.html#problemId=1003
n的阶乘后面有多少个0?
6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。
输入
一个数N(1 <= N <= 10^9)
输出
输出0的数量
输入样例
5
输出样例
1
二、思路描述
一个数末尾有多少个0,是由这个数中因子2和5的数量决定的。1200=24×3×52。其中2的幂次为4,5的幂次为2,min(4,2)=2所以有2个0。250 = 2×53,其中2的幂次为1,5的幂次为3,min(3,1)=1所以有1个0。我们要通过n来求出n的阶乘末尾有多少个0。
这道题跟分解n的质因数其实没有关系,这道题实际上是求5的倍数有着什么样的关系的。
假设n=75。我们把所有是5的倍数的数都列出来看看能发现什么:
① 5 10 15 20 30 35 40 45 55 60 65 70 (第一行是每个数字只包含一个5因子)
②25 50 75(第二行是每个数字包含2个因子)
1 ~ n的因子中5的数量一定小于因子中2的数量,所以问题转为,求1 ~ n中有多少个因子5。
我们要求的是n的阶乘,把1~n所有数字都乘起来,每5个数就会产生一个5的倍数,每25个数就会产生一个25的倍数,每125个数就会产生一个125的数……
其中5的倍数共有n/5个,25的倍数共有n/25个.... 每次我们拿n除以的数都要乘5倍(我的代码里被n除的数是cur,每次cur都要*5。一直除到n < cur为止)
我们举个例子来看看是怎么个回事。
n=125
n的阶乘 = 125 * 124 * ……* 100 * …… * 75 * …… * 50 * …… * 25 * …… * 10 * 5 * 1
sum = 125 / 5 + 125 / 25 + 125 / 125
= 25 + 5 +1
= 31
所以当n等于125时,n(125)的阶乘后面有31个0。
三、代码
#include<cstdio> #include<iostream> using namespace std; int main(){ long long n, sum=0, cur=5; cin >> n; while(n >= cur){ sum += n / cur; cur = cur * 5; } cout << sum << endl; return 0; }