设计一个算法,计算出n阶乘中尾部零的个数

样例
11! = 39916800,因此应该返回 2

对于这个问题,我们的思路如下,首先要想得到尾部为0,那么一定是乘以5或者5的倍数,才会得到这样的结果,那么举一个例子,我们设参数为101,也就是101的阶乘尾部有多少个零,我们列举一下5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,这些数和偶数相乘都可以得到尾部为0的数,(这里的偶数数量够不够这个问题我们完全不用考虑,因为阶乘可以为我们提供足够的偶数)那么这样的数到底有多少?用101/5(整除)=20,我们知道有20个,但是,有没有发现一个问题,25,50,75,100这些数和足够偶数相乘都是尾部会有两个0的,那么我们发现10/5=20,20的用处在哪里?

让我们再想象一下,假如是求1001的阶乘,1001/5=200,此处求出来的是从1到1001之间(包括1和1001)是5的倍数的数有多少个,那么我们要求25(5*5)的倍数呢,125(5*5*5)的倍数呢?

回到101的阶乘这个问题上,101/5=20;101/5/5=20/5=4,可以知道有4个数是25的倍数,25的倍数也肯定是5的倍数,在计算尾部0个数的时候,只需要加上是25的倍数的个数即可。

代码很简单,使用递推(不是递归!!!谢谢指正~)即可,如下:

 

public class Solution {    /*     * @param n: An integer     * @return: An integer, denote the number of trailing zeros in n!     */    public long trailingZeros(long n) {        // write your code here, try to do it without arithmetic operators.        long sum=0;        while(n/5!=0){            n=n/5;            sum+=n;        }        return sum;    }}

如果有所帮助,脸皮厚求个赞~

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

 

 

 

 

 

 

©著作权归作者所有:来自51CTO博客作者秦怀杂货店的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 函数编写n的阶乘的两种方法:循环和递归
  2. 求1-10阶乘的和
  3. 学习C语言第四天(循环语句练习题)
  4. [牛课习题]求最小公倍数
  5. 从阶乘、斐波那契、汉诺塔剖析彻底搞懂递归算法
  6. Android(OPhone) 学习笔记 - 地图(3)
  7. [置顶] android下调试声卡驱动之wm8960介绍二
  8. Android(安卓)Training精要(三)不同分辨率图片缩放倍数
  9. 倍数提高工作效率的 Android(安卓)Studio 奇技

随机推荐

  1. 使用javascript将文件输入到php文件
  2. 如何使用Amazon S3创建一次性下载链接?
  3. 什么是从我的PHP网站过滤无效的utf8?
  4. php会话不在chrome和firefox中工作但在IE
  5. 快速配置IIS 6.0 php fastcgi +Zend Opti
  6. Ionic-3如何动态改变离子主题
  7. Apache引起的wampserver安装好第二次使用
  8. PHP面向对象笔记 —— 113 封装概念
  9. 如果改变输入值,jQuery提交表单
  10. Kohana框架3.3 cookie设置两次