zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    rustlang入门教程
    中间件日志切割
    Redis非关系型缓存数据库集群部署、参数、命令工具
    SaltStack自动化软件简介及安装
    CentOS根目录下各目录介绍
    Dockerfile书写介绍及构建ssh镜像、tomcat镜像、nginx镜像
    DockerFile执行报错解决
    阿里云CentOS7.2把默认语言修改成中文
    JavaScript 如何判断一个数据的类型
    MongoDB windows 下安装配置
  • 原文地址:https://www.cnblogs.com/elisa02/p/12811208.html
Copyright © 2011-2022 走看看