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;
    }
  • 相关阅读:
    Unity5.0 手动激活
    日文“表” php 会报错
    U3D 精灵的点击监听
    Android 数据库ORM框架GreenDao学习心得及使用总结<一>
    Eclipse 打包过滤 Log.e
    Android SQLite系列
    Android Material Design调色板
    Android Studio系列教程六--Gradle多渠道打包
    Android 模块化编程之引用本地的aar
    使用 Chrome 来调试你的 Android App
  • 原文地址:https://www.cnblogs.com/elisa02/p/12811208.html
Copyright © 2011-2022 走看看