计算出n阶乘中尾部零的个数
2018-02-20 15:45
295 查看
题目
设计一个算法,计算出n阶乘中尾部零的个数样例
11! = 39916800,因此应该返回 2解答
首先,算出n的阶乘的结果再去计算末尾有多少个0这种方法是不可取的, 因为n的阶乘是一个非常大的数,分分种就会溢出。我们应当去分析, 是什么使n的阶乘结果末尾出现0。n阶乘末尾的0来自因子5和2相乘,5*2=10。因此,我们只需要计算n的阶乘里, 有多少对5和2。注意到2出现的频率比5多,因此,我们只需要计算有多少个因子5即可。 我们可以列举一些例子,看看需要注意些什么:
5!, 包含1*5, 1个5
10!, 包含1*5,2*5, 2个5
15!, 包含1*5,2*5,3*5, 3个5
20!, 包含1*5,2*5,3*5,4*5, 4个5
25!, 包含1*5,2*5,3*5,4*5,5*5, 6个5
…
给定一个n,用n除以5,得到的是从1到n中包含1个5的数的个数;然后用n除以5去更新n, 相当于把每一个包含5的数中的因子5取出来一个。然后继续同样的操作,让n除以5, 将得到此时仍包含有5的数的个数,依次类推。最后把计算出来的个数相加即可。 比如计算25的阶乘中末尾有几个0, 先用25除以5得到5,表示我们从5,10,15,20,25中各拿一个因子5出来,总共拿了5个。 更新n=25/5=5,再用n除以5得到1,表示我们从25中拿出另一个因子5, 其它的在第一次除以5后就不再包含因子5了。
代码如下:
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 num = 0; while(n>0) { num += n / 5; n = n / 5; } return num; } }
相关文章推荐
- 设计一个算法,计算出n阶乘中尾部零的个数
- 阶乘尾部零的个数,递归计算
- 计算n阶乘中尾部零的个数--O(logN)算法
- 计算n阶乘中尾部零的个数
- 尾部的零,计算出n阶乘中尾部零的个数
- 设计一个算法,计算出n阶乘中尾部零的个数
- 如何计算阶乘运算结果尾部有多少个零
- 计算n阶乘中尾部零的个数
- lintcode第二题 计算n阶乘中尾部零的个数
- LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
- Linux命令--计算阶乘及进制转换及统计尾部某一字符的个数
- 计算n阶乘中尾部零的个数
- 计算出n阶乘中尾部零的个数
- LintCode 第二题 计算阶乘结果尾部的零
- 172. Factorial Trailing Zeroes (计算n的阶乘尾部有多少个零)
- 计算n阶乘中尾部0的个数
- 实验5-2 编制程序,输入m、n(m≥n≥0)后,计算下列表达式的值并输出。 要求将计算阶乘的运算编写作函数fact(n),函数返回值的类型为float。
- 利用模板编译期计算阶乘
- 计算阶乘代码
- 精度计算——大数阶乘