1. 程式人生 > >n!尾部0個數問題

n!尾部0個數問題

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;
}