n!尾部0个数问题

描述

n!计算尾部有多少个0

分析

可以先计算出结果,再通过取余的方式,计算有多少个0.
但这种方式时间复杂度就是O(n) (while循环n次相乘)

挑战

时间复杂度O(logn)

再次分析

n! = 1 x 2 x 3 x 4 x 5 x ... x n;

相当于可以凑多少个10出来,即2x5出来(10=2x5,没有别的质数组合),

n! = 1 x 2 x 3 x 4 x 5 x ... x n = 1 x 2 x 3 x (2 x 2) x 5 x ...  x n;

如果n = 11,则相当于

11 = 1 x 2 x 3 x (2 x 2) x 5 x (2 x 3) x 7 x (2 x 2 x 2) x (3 x 3) x (2 x 5) x 11;

因为2的个数始终大于5的个数,相当于找5有多少个,即0有多少个.从1-11每过5有一个5.
n = 26

26 =  1 x 2 x 3 x (2 x 2) x 5 x ... x (5 x 5) x (2 x 13);

即每过一个25,会有两个5出现.
同理,每过一个125 = 535出现.依次类推.
所以,可以计算1-n有多少个5 = 51,有多少个25 = 52,有多少个125 = 53…依次累加,就是0的个数.

代码实现:

运行没有问题,也通过了运行代码,但是提交出错

int trailingZeros(int n) {
	int sum = 0;
	int i = 1;
	while (pow(5, i) <= n) {
		sum += n / pow(5, i);
		i++;
	}
	return sum;
}

这段代码可以

int trailing(int n) {
	int sum = 0;
	while (n > 0) {
		sum += n / 5;
		n /= 5;
	}
	return sum;
}

猜你喜欢

转载自blog.csdn.net/weixin_42983482/article/details/82773511
今日推荐