• HDU 1124 Factorial (阶乘后缀0)


    题意: 给一个数n,返回其阶乘结果后缀有几个0。

    思路:

      首先将n个十进制数进行质因数分解,观察的得到只有2*5才会出现10。那么n!应含有min(2个数,5个数)个后缀0,明显5的个数必定比2少,所以后缀0的个数为质因数后的5的个数。

      为何这么说?例如n=15,那么{1 2 3 4 5 6 7 8 9  10 11 12 13 14 15},那么可以产生2的数字有{2,4,6,8,10,12,14},可以产生5的只有{5,10,15},质数中只有2乘以5才能形成10,那么min(2个数,5个数)就决定了可以产生10的个数,也就决定了产生的0的个数。

      想将[1,n]逐个进行质因数分解来取统计5的个数?不用,有更简单的方法。

      假设n=15,将n/5得到3,则[1,15]中有3个是5的倍数即{5,10,15},只有是5的倍数才能产生质因数5,那么count+=3。接着,这3个数字可能还很大,除以5之后也许还能继续被5除(例如25就可以除两次)。然而{5,10,15}除完之后变成了{1,2,3},这个序列一定是连续的自然数,由于全都小于5,那肯定是没能再有5的产生了。假如n/5大于5呢?那么[1,n]中的5的倍数肯定会变成[1,n/5],又是一个阶乘的形式,继续用上面的方法继续拆出所有的5,直到n/5/5/5...的结果小于5为止。每次n/5之后的数就是count的结果。

     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 int f(unsigned int n)
     5 {
     6     if (n < 5) {
     7         return 0;
     8     }
     9     return n / 5 + f(n / 5);
    10 }
    11 
    12 int main()
    13 {
    14     //freopen("input.txt", "r", stdin);
    15     unsigned int t, a;
    16     cin>>t;
    17     while(t--)
    18     {
    19         scanf("%d",&a);
    20         printf("%d
    ",f(a));
    21     }
    22 
    23     return 0;
    24 }
    AC代码
  • 相关阅读:
    作业07-Java GUI编程
    作业06-接口、内部类
    作业05-继承、多态、抽象类与接口
    作业14-数据库
    作业13-网络
    作业12-流与文件
    作业11-多线程
    作业10-异常
    作业09-集合与泛型
    作业08-集合
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4604473.html
Copyright © 2020-2023  润新知