題目:給定乙個數 n, 1<= n<=10^15,求第k小因子。假設10^8次執行時間為1s。
這道題我相信大家都能夠想到o(n)的解決方法,但是考慮到時間複雜度,如果乙個數為10^15次方,這將是乙個很大的計算時間,因此o(n)不可取。
接下來提供乙個 o(n^(1/2))的方法,其實也很簡單,就是只遍歷 sqrt(n)次,因為因子數是一一對應的(比如24,我們求出了因子3,那麼因子8也就能夠求出來)。如此下來,我們的計算時間可以控制在1s以內。
思路:
假設 n=24;
用兩個陣列a、b分別儲存小因子數(如 1,2,3,4)和大因子數(24,12,8,6),大因子數可以通過 【n/小因子數】得到。
得出第k小因子與a、b陣列元素個數之間的關係,求出最終結果。
注意:
1. 所有的 數用 unsigned long long 資料型別,以防越界;
2. 對於25這種(存在 5*5的情況),不要重覆記錄因子個數。
以下是源**:
#include#includeusing namespace std;
unsigned long long thekfactor(unsigned long long n, int k) }
// 此時,j 為陣列 a 中因子個數,t為陣列 b 中因子個數
if (k <= 0 || k > j + t) return 0; // 不合法的 k, 返回 0
if (k <= j) return a[k-1]; // 小於一半
else return b[t-(k-j)]; // 大於一半
}int main()
{ unsigned long long max = thekfactor(1000000000000000,256); // 1000000000000000,由此可知其有 256 個因子
cout計算結果:
由此發現,時間複雜度大大降低。
第k小整數
現有n個正整數,n 10000,要求出這n個正整數中的第k個最小整數 相同大小的整數只計算一次 k 1000,正整數均小於30000。輸入格式 第一行為n和k 第二行開始為n個正整數的值,整數間用空格隔開。輸出格式 第k個最小整數的值 若無解,則輸出 no result 輸入樣例 1 10 3 1 ...
1492 n 的第 k 個因子
給你兩個正整數n和k。如果正整數i滿足n i 0,那麼我們就說正整數i是整數n的因子。考慮整數n的所有因子,將它們公升序排列。請你返回第k個因子。如果n的因子數少於k,請你返回 1。示例 1 輸入 n 12,k 3輸出 3解釋 因子列表包括 1,2,3,4,6,12 第 3 個因子是 3 示例 2 ...
1492 n 的第 k 個因子
給你兩個正整數 n 和 k 如果正整數 i 滿足 n i 0 那麼我們就說正整數 i 是整數 n 的因子。考慮整數 n 的所有因子,將它們 公升序排列 請你返回第 k 個因子。如果 n 的因子數少於 k 請你返回 1 1.生成所有存起來,然後判斷,o nlogn 很暴力 2.o n 直接一次迴圈,過...