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;
    }
  • 相关阅读:
    SQL Server DB 基于多核CPU的设置
    如何在64位的Windows 2008的系统配置导入Excel功能
    如果在IIS中没有将虚拟目录配置为应用程序,则可能导致此错误
    .NET 数据绑定中空格符的问题
    .net 读取客户端文件的方法
    spring4+quartz
    web端 图片上传
    Maven配置setting.xml详细说明
    Timer
    实现quartz定时器及quartz定时器原理介绍
  • 原文地址:https://www.cnblogs.com/elisa02/p/12811208.html
Copyright © 2011-2022 走看看