51nod 1003 阶乘后面0的数量

一、题目描述

题目网址: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;
}

 

posted @ 2020-04-30 21:16  elisa02  阅读(245)  评论(0编辑  收藏  举报