力扣【阶乘问题】leetcode-172、阶乘后的零;leetcode-793、阶乘后K个零;
目录
- 题目一:172、阶乘后的零
- 题目二:793、阶乘后K个零
题目一:172、阶乘后的零
给定一个整数 n,返回 n! 结果中,尾数中零的数量
举一个栗子:6!=【 1 * 2 * 3 * 4 * 5 * 6 】
6!= 720
所以的话就是返回1,因为720 后面只有一个0
1、那么应该怎么做呢?
乍一看,感觉问题很复杂,其实只要冷静下来,一步一步简化,结果是十分明了的~
第一个想法:首先把阶乘算出来,然后从前到后每一位都遍历吗?
这个方法肯定是不可取的,复杂度太高了。
2、我们只需要简单分析一下
题目要求看 0 的数量 ,
1、末尾的0 是从哪里来的?
肯定是乘以 10 得来的!
2、10 是从哪里来的?
10 = 2 * 5;也就是说,10 只能从2 和5 相乘得到;
只看 2 和 5 出现的次数,因为只有2 和 5 才会产生 10 ,才会有 0 的呀!
当然,这里要多说一嘴,0 就不要考虑了,因为 0!= 1 啊。
3、问题就做可以做第一次简化:
判断n!= 【1 * 2 * 3 * …… * n 】 中到底有多少个 2 和 5 的组合?
随后,我们继续分析,还可以继续优化;
10 从 2 * 5 中得到,单单一个 2 或者 一个 5 ,或者和其它组合,都是没法产出 10 的1、只有一个2 一个5 结合在一起才行
2、进一步,2多 5 少呢?5多 2 少呢?
自然是根据少的来嘛!
4、我们再举几个栗子分析
6!=【 1 * 2 * 3 * 4 * 5 * 6 】 6 = 2 * 3;
所以两个 2 ,一个5,于是一个10,
10! =【 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10】
2 4 6 8 10 都可以出来2 ,一共七个2;5= 1 *5;10 = 2 * 5;
一共两个5;所以两个10
不难看出,2 的个数是 大于等于 5 的个数的;这也是我们第二次简化的依据
5、问题就做第二次简化:
判断 n!= 【1 * 2 * 3 * …… * n 】 中到底乘了多少个 5
这样一来,问题就简单很多了!
注意:问题到这里就分析完了吗?当然没有,我们还应该注意以下这样的数字:
10 = 2 * 5 贡献1个5
5 = 3 * 5 贡献1个5
25 = 5 * 5 贡献2个5
125 = 5 * 5 * 5 贡献3个5
以此类推~ 这些数字都是我们应该处理的
有了上述的分析和注意点,我们便可以写出代码了
class Solution {public: int trailingZeroes(int n) { int count = 0; while(n >= 5) { count += n / 5; n /= 5; } return count; }
};
题目二:793、阶乘后K个零
1、题目描述:给你一个数字 k ,找出有多少个非负整数 n,使得 n! 后方,有k个0注意: k 是范围在 [0,10^9]的整数
说实话这个题有一点数学了,但是依旧是那一个解题步骤逐步分析!简化!
简单分析:通过上一题,我们可以知道,只有10的倍数,才会有0每有一对2和5的组合,n! 后面就会多一个0而 n!展开中,2个数比5个数多问题就转化为 n! 有多少个 5 作为因子
既得: n 的阶乘末尾 0 的个数 为:k;
满足公式:k = n/5 + n/5^2 + n/5^3 + ……
根据条件: k 是范围在 [0,10^9]的整数
得到:n < 5 *10^9
2、n 每+5,阶乘就会至少多乘一个5,末尾就会至少多一个0
有解,那就是5个,如果无解就是0个!
只有这两个情况!
n可以取这么大的数?该如何解题呢?
3、二分法 降维打击!
力扣【阶乘问题】leetcode-172、阶乘后的零;leetcode-793、阶乘后K个零;相关推荐
- LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))
第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...
- 力扣学习记录(每日更新)
文章目录 引言 简单 力扣:1 两数之和 力扣:20 有效的括号 力扣:21 合并两个有序链表 力扣:22 括号生成 力扣:27 移除元素 力扣: 35 搜索插入位置 力扣:70 [爬楼梯](http ...
- 【LeetCode 172. 阶乘后的零】
LeetCode 172. 阶乘后的零 题目描述 解题思路 class Solution {public int trailingZeroes(int n) {//思路//计算阶乘后为零的个数 因为2 ...
- 【Leetcode - 172】阶乘后的零(思维)
给定一个整数 n ,返回 n! 结果中尾随零的数量. 提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 示例 1: 输入:n = 3 输出:0 解释:3! ...
- 力扣1006笨阶乘问题
这里写目录标题 问题描述 常规解法 优化解法 问题描述 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 ...
- Leetcode-How-What 力扣Leetcode刷题指南
Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...
- 力扣(LeetCode)刷题,简单题(第7期)
目录 第1题:剪绳子1 第2题:Excel表列序号 第3题:阶乘后的零 第4题:位1的个数 第5题:快乐数 第6题:颠倒二进制 第7题:字符串压缩 第8题:丑数 第9题:有效的字母异位词 第10题:各 ...
- 力扣- -阶乘函数后K个零
力扣- -阶乘函数后K个零 文章目录 力扣- -阶乘函数后K个零 一.172. 阶乘后的零 二.分析 三.代码 四.阶乘函数后K个零 五.分析 六.完整代码 一.172. 阶乘后的零 二.分析 求n! ...
- 力扣(LeetCode)刷题,简单题(第24期)
目录 第1题:两个列表的最小索引总和 第2题:反转字符串中的元音字母 第3题:整数反转 第4题:将有序数组转换为二叉搜索树 第5题:第N个泰波那契数 第6题:数组序号转换 第7题:质数排序 第8题:日 ...
最新文章
- 文本分类入门(七)相关概念总结
- MongoDB- 简单操作命令
- 灵魂拷问!一起刷完了这份1307页的安卓面试宝典吧,不吃透都对不起自己
- 5848. 树上的操作
- 【JSP】jsp报错:Syntax error, insert } to complete MethodBody
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(6) - 移位与循环移位指令
- python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
- UDP网络编程-广播
- cdr如何制作图表?
- vs2010开发android教程,用Visual Studio 2010开发Android应用
- Java中打印数组的几种方法
- 1.spring入门 - spring实战第五版
- 手动编译源代码安装wget
- 金蝶K3系统上机日志如何清除
- Python 每日一记31相关性矩阵建立
- 若依代码生成使用教程
- Unity IOS 微信SDK 记录
- 百度笔试题——首相的密道
- 海螺环保上市破发:收盘市值178亿港元 由海螺创业分拆
- 13种最为荒谬的编程语言