以sqrt(n) 爲時間複雜度的算法並很少見,最具表明性的就是分解質因數了。html
將一個整數分解爲若干質因數之乘積。python
樣例 1:算法
輸入:10 輸出:[2, 5]
樣例 2:markdown
輸入:660 輸出:[2, 2, 3, 5, 11]
你須要從小到大排列質因子。app
class Solution: """ @param num: An integer @return: an integer array """ def primeFactorization(self, num): # write your code here result = [] k = 2 while k*k <= num: if num % k == 0: num = num//k result.append(k) else: k += 1 if num > 1: result.append(num) return result
http://www.lintcode.com/problem/prime-factorization/svg
Java:性能
public List<Integer> primeFactorization(int n) { List<Integer> result = new ArrayList<>(); int up = (int) Math.sqrt(n); for (int k = 2; k <= up && n > 1; ++k) { while (n % k == 0) { n /= k; result.add(k); } } if (n > 1) { result.add(n); } return result; }
Python:優化
def primeFactorization(n): result = [] up = int(math.sqrt(n)); k = 2 while k <= up and n > 1: while n % k == 0: n //= k result.append(k) k += 1 if n > 1: result.append(n) return result
C++:ui
vector<int> primeFactorization(int n) { vector<int> result; int up = (int)sqrt(n); for (int k = 2; k <= up && n > 1; ++k) { while (n % k == 0) { n /= k; result.push_back(k); } } if (n > 1) { result.push_back(n); } return result; }
質因數分解有一種更快的算法,叫作Pollard Rho快速因數分解。該算法時間複雜度爲O(n1/4)O(n^{1/4})O(n1/4),其理解起來稍有難度,有興趣的同窗能夠進行自學,參考連接。spa