**
如:整數 15,有1, 15, 3,5 共4個因子。要求演算法的複雜度為o(sqrt(n)).
首先想到的方法是:逐個列舉,從 1 到 n/2 + 1(當然也可以是 從 1 到 n),這樣演算法的複雜到至少是o(n)的,
而且,其中還要去重,比如 24 = 4*6 = 6*4,這樣還要分配空間來存放找到的因子,並且每次新增的時候,還要
查詢是否已經在列表中,採用二分查詢也要logn,因此最終的演算法複雜度也要達到o(nlogn)。不符合題目的要求。
其實,重複因子的出現是在sqrt(n)的附近,再加上題目給出的演算法複雜度的提示,因此我們可以寫出如下的演算法:
/**
* 求正整數 n的因子數
* @param n
* @return
*/
public
int
factors(
int
n)
else
}
else
}
}
return
count;
}
/**
* 有沒有漏掉呢?
*
* 假設存在乙個正整數 k,使得 k * m = n, 且 k 不在 1, sqrt(n)之間,且m 為正整數
* 那麼 m必在(1, sqrt(n))之間,否則 k*m >sqrt(n)*sqrt(n) = n,與 k*m = n矛盾
* 即只要存在兩個正整數k, m,使得 k * m = n,那麼k, m中必有乙個在[1, sqrt(n)]區間中
*/
注釋部分,相當與演算法正確性的證明。
當然,如果不呼叫系統的庫函式,可能還需要自己實現求乙個整數的平方根的演算法,根據本題要求,不要求精度太高,只需要
到 0.1就夠了。
擴充套件:如果n為負數呢?
求正整數的質因子 因子個數 所有因子之和
質因子分解,輸入乙個int型正整數,輸出其分解為質因數的乘法算式。include include const int maxn 100010 bool is prime int n return 0 最後指出,如果要求乙個正整數n的因子個數,只需要對其質因子進行分解,得到質因子pi的個數分別為e1,...
求乙個陣列中第 k 個缺失的正整數
1359第 k 個缺失的正整數,給你乙個 嚴格公升序排列 的正整數陣列 arr 和乙個整數 k 請你找到這個陣列裡第 k 個缺失的正整數。示例 1 輸入 arr 2,3,4,7,11 k 5 輸出 9 解釋 缺失的正整數包括 1,5,6,8,9,10,12,13,第 5 個缺失的正整數為 9 示例 ...
關於求乙個正整數階乘的實現
第一種實現小數字階乘 class calculate public long calculatefactorial long n else if n 0 else 第二種實現方法 class calculate public string calculate long n else if n 0 n...