求乙個正整數的因子個數

2021-07-16 12:16:35 字數 1418 閱讀 5848

** 

如:整數 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

*/

publicintfactors(intn)else

}else

}

}

returncount;

}

/**

* 有沒有漏掉呢?

*

* 假設存在乙個正整數 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...