zoukankan      html  css  js  c++  java
  • hdu1124 Factorial (求解一个数的阶乘中出现多少个0)

    解决该题要注意一下几个方面:

    1、任何一个自然数都可分解质因数。N!=1*2*3*4*5*6*...*N=2^a*3^b*5^c*7^d......=(2*5)^c*2^(a-c)*3^b*7^d......=10^c*2^(a-c)*3^b*7^d......

    2、两数相乘产生0,只会是2和5相乘。又由于在分解质因数时小的质数的幂次一定不小于大的质数的幂次大,所以a>=c。故解决该题转化成找出N!中5的幂次。

    3、如何找出5的幂次呢?举例说明:N=26,阶乘中包含因数5、10、15、20、25,可知5的幂次为6。5=5*1,10=5*2,15=5*5,20=5*4,25=5*5,求解时用26/5=5,

    再用5/5=1,再用1/5=0,所以总幂次为5+1+0=6。为什么可以这样求?在N!中数是连续增加的,5也是以其倍数渐进增加,一直增加到不大于N且是5的整数倍的最大整数。

    这样一来就可以用N/5来确定出现多少个5了。当然,这还不够。比如26/5=5,与其幂次为6不符!原因在于25=5*5,其中含有2个5!所以,又有了紧接着的5/5=1,1/5=0了。

    如:50!:

    含有10个5的倍数的数:5,10,,15,20,25,30,35,40,45,50

    含有2个5^2的倍数的数:25,50    {50 / 5 / 5=2}

    50!中一共有12个5相乘,那么尾零必定有12个

     

     1 #include<stdio.h>
     2 int main()
     3 {
     4     __int64 t,n,i,j,sum;
     5     scanf("%I64d",&t);
     6     while(t--)
     7     {
     8         scanf("%I64d",&n);
     9         sum=0;
    10         while(n)
    11         {
    12             n=n/5;
    13             sum+=n;
    14         }
    15         printf("%I64d
    ",sum);
    16     }
    17     return 0;
    18 }
    View Code

     

     

     

  • 相关阅读:
    python3笔记二十二:正则表达式之函数
    python3笔记二十一:时间操作datetime和calendar
    python3笔记二十:时间操作time
    python3笔记十七:python文件读写
    Spring常用注解
    Pytorch实现卷积神经网络CNN
    Keras实现autoencoder
    Keras实现LSTM
    TensorFlow实现CNN
    Recurrent Neural Networks vs LSTM
  • 原文地址:https://www.cnblogs.com/zlyblog/p/3191112.html
Copyright © 2011-2022 走看看