程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode 172:Factorial Trailing Zeroes

LeetCode 172:Factorial Trailing Zeroes

編輯:C++入門知識

LeetCode 172:Factorial Trailing Zeroes


Given an integer n, return the number of trailing zeroes in n!.

 

//題目描述:給定一個整數n,返回n!(n的階乘)數字中的後綴0的個數。
//方法一:先求得n的階乘,然後計算末尾0的個數,這種方法當n比較大是,n!會溢出
class Solution {
public:
	int trailingZeroes(int n) {
		if (n == 0) return 0;
		int m = 0;
		int cnt = 0;
		int k = factorial(n);
		while (k){
			m = k % 10;
			k = k / 10;
			if (m == 0)	
				cnt++;
			else
				break;
		}
		return cnt;
	}

	//計算n的階乘
	int factorial(int n1){
		if (n1 == 0) return 1;
		else{
			return n1*factorial(n1 - 1);
		}
	}
};

//方法二:考慮n!的質數因子。後綴0總是由質因子2和質因子5相乘得來的,如果我們可以計數2和5的個數,問題就解決了。
//考慮例子:n = 5時,5!的質因子中(2 * 2 * 2 * 3 * 5)包含一個5和三個2。因而後綴0的個數是1。
//n = 11時,11!的質因子中((2 ^ 8) * (3 ^ 4) * (5 ^ 2) * 7)包含兩個5和八個2。於是後綴0的個數就是2。
//我們很容易觀察到質因子中2的個數總是大於等於5的個數,因此只要計數5的個數即可。
//那麼怎樣計算n!的質因子中所有5的個數呢?一個簡單的方法是計算floor(n / 5)。例如,7!有一個5,10!有兩個5。
//除此之外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。
//例如n=25, n!=25*24*23*...*15...*10...*5...*1=(5*5)*24*23*...*(5*3)*...(5*2)*...(5*1)*...*1,其中25可看成5*5,多了一個5,應該加上
//處理這個問題也很簡單,首先對n÷5,移除所有的單個5,然後÷25,移除額外的5,以此類推。下面是歸納出的計算後綴0的公式。
//n!後綴0的個數 = n!質因子中5的個數= floor(n / 5) + floor(n / 25) + floor(n / 125) + ....

class Solution2{
public:
	int trailingZeroes(int n){
		int res = 0;
		while (n){
			res = res + n / 5;
			n = n / 5;
		}
		return res;
	}
};

\

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved