【力扣LeetCode】阶乘尾数 面试题16 05 Java 三种思路【数学 简单】

【题目】

设计一个算法,算出 n 阶乘有多少个尾随零。

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n)

来源:力扣(LeetCode)

链接

【思路】

一、暴力法

先求出 n 的阶乘,再从个位往高位判断。但是这样算出来的数太大了,而且会超时,所以不可取。

二、计算因数2和5的个数

因为我们要计算 n! 有多少个尾随零,所以我们只需要计算因数2和5的个数(2 X 5 = 10),再比较个数,最小的数为尾随零的个数。

public int trailingZeroes(int n) {
	long a = 0, b = 0;
	for(long i = n; i > 1; i--) {
		long op = i;
		while(op % 5 == 0) {
			a++;
			op /= 5; 
		}
		
		while(op % 2 == 0) {
			b++;
			op /= 2; 
		}
	}
	return (int) (a >= b ? b : a);
}

但是呢,当输入的数字太大时,也会超时

三、思路二的改版

我们可以发现,当输入的数字越大,2的数量远远小于5的数量,因此我们只需要计算5的数量就行了。

n! = 1 * 2 * 3 * 4 * 5 * .... * (n-1) * n

我们可以化简一下 n! ,我们会发现下面的规律:

n! = 1 * 2 * 3 * 4 * 5 * .... * (2*5) * ... * (3*5) * ...

每隔5个数就会出现一个5

每隔25个数会出现一个25,而25存在两个5,所以我们还需要计算有多少的25(n/25)

每隔125个数会出现一个125,而25存在三个5,所以我们还需要计算有多少的25(n/125)
… …

所以:

ans = n / 5 + n / 25 + n / 125 + …

简化:ans = n/5 + n / 5 / 5 + n / 5 / 5 / 5 + …

public int trailingZeroes(int n) {
	int ans = 0;
	while(n >= 5) {
		n /= 5;
		ans += n;
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值