【leetcode】172. Factorial Trailing Zeroes
2016-06-16 16:00
405 查看
一、题目描述
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
题目解读:给一个数n,求n! 的后缀0的个数。解决方法的时间复杂度在log(n)内。
思路:说实话,这道题我一开始没看懂英文。(英语水平太渣,捂脸....)
首先想到的方法肯定是求出 n! 的值,然后从低位往高位遍历,统计0的个数直到遇到第一个非零数。
但是这种方法时间复杂度太高,并且数字稍大阶乘就会溢出,因此不可取。
从数学角度分析: 阶乘 n! 末尾0的个数是由其中因数2和因数5的个数决定。因此,我们只需求出因数2的个数和因数5的个数,取其中最小值就是我们所要的值。
举几个例子分析一下:
n = 5 时, 5!的质因子中(2* 2* 2* 3* 5)包含一个5和三个2,因此后缀0的个数是1。
n = 11时,11!的质因子中包含两个5和三个2,因此后缀0的个数是2。
很容易发现质因子中2的个数总是大于等于5的个数。因此只要统计5的个数就可以了。
对于计算 n! 的质因子中所有5的个数,同样举几个例子来分析一下:
观察 5!的质因子中有3个5(来自5,10,15),所以计算n/5就可以得到3。
观察25!的质因子中有6个5(来自5,10,15,20,25),这里25提供了2个5,因此除了算n/5,还要算n/5/5的值。
.....
总结起来就是计算n/5,n/5/5,n/5/5/5,...直到商为0。
c++代码(8ms,0.88%)
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
while(n>0){
int k = n/5;
count+=k;
n=k;
}
return count;
}
};
这道题确实需要好好分析才能写出代码。值得回味。
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
题目解读:给一个数n,求n! 的后缀0的个数。解决方法的时间复杂度在log(n)内。
思路:说实话,这道题我一开始没看懂英文。(英语水平太渣,捂脸....)
首先想到的方法肯定是求出 n! 的值,然后从低位往高位遍历,统计0的个数直到遇到第一个非零数。
但是这种方法时间复杂度太高,并且数字稍大阶乘就会溢出,因此不可取。
从数学角度分析: 阶乘 n! 末尾0的个数是由其中因数2和因数5的个数决定。因此,我们只需求出因数2的个数和因数5的个数,取其中最小值就是我们所要的值。
举几个例子分析一下:
n = 5 时, 5!的质因子中(2* 2* 2* 3* 5)包含一个5和三个2,因此后缀0的个数是1。
n = 11时,11!的质因子中包含两个5和三个2,因此后缀0的个数是2。
很容易发现质因子中2的个数总是大于等于5的个数。因此只要统计5的个数就可以了。
对于计算 n! 的质因子中所有5的个数,同样举几个例子来分析一下:
观察 5!的质因子中有3个5(来自5,10,15),所以计算n/5就可以得到3。
观察25!的质因子中有6个5(来自5,10,15,20,25),这里25提供了2个5,因此除了算n/5,还要算n/5/5的值。
.....
总结起来就是计算n/5,n/5/5,n/5/5/5,...直到商为0。
c++代码(8ms,0.88%)
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
while(n>0){
int k = n/5;
count+=k;
n=k;
}
return count;
}
};
这道题确实需要好好分析才能写出代码。值得回味。
相关文章推荐
- WSASocket failed 10013 处理
- 打开金蝶AIS文件方法
- Redis redis.clients.jedis.exceptions.JedisDataException: ERR Operation against a key holding the wr
- 转载http://jingyan.baidu.com/article/bad08e1e87138209c8512118.html
- AIDL进程间通讯的一些注意问题
- CDISC SDTM DS domain学习笔记
- oracle查看允许的最大连接数和当前连接数等信息(转自:http://blog.csdn.net/haiross/article/details/41944493)
- 钥匙串KeyChain的使用
- “机器学习”相关资料分享
- tail和head命令
- INS-35172 Target database memory(945MB) excessds the systems available shared memory({0}MB)
- 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
- Paint House
- Openstack组件部署 — keystone(domain, projects, users, and roles)
- 2D Closest Pair Problem
- 朴素贝叶斯简易解释
- Intellij Idea essentails 翻译
- xiugai DNS
- 将main方法打成jar包,并引用第三方的maven jar包
- failed to load the JNI shared library