在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 最大公約數(shù)、最小公倍數(shù)
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回數(shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個數(shù)統(tǒng)計

最大公約數(shù)、最小公倍數(shù)

求解最小公倍數(shù)和最大公約數(shù)是我們開始編程的時候經(jīng)常需要練習(xí)的題目。從題面上看,好像我們需要求解的是兩個題目,但其實就是一個題目。那就是求最大公約數(shù)?為什么呢?我們可以假想這兩個數(shù)m和n,假設(shè)m和n的最大公約數(shù)是a。那么我們可以這樣寫:

m = b a; n = c a;

所以m和n的最小公倍數(shù)就應(yīng)該是abc啊,那不就是m * n / a,其中m和n是已知的,而a就是那個需要求解的最大公約數(shù)。所以就有了下面的代碼,

int GetMinCommonMultiple(int m, int n)  
{  
    assert(m && n);  

    return m * n / GetMaxCommonDivide(m, n);  
} 

下面就可以開始最大公約數(shù)的求解。其實,關(guān)于最大公約數(shù)的求解,大家看到的更多是各種捷徑,比如說歐幾里得法。歐幾里得法構(gòu)思十分巧妙,它利用了m、n和n、m%n之間的最大公約數(shù)是相等的這一重要條件,充分利用替換的方法,在 m%n等于0的那一剎那,獲得我們的最大公約數(shù)。然而,我們平時自己所能想到的方法卻不多,下面的方法就是具有典型意義的一種:

  • 首先對數(shù)據(jù)m和n判斷大小,小的賦值給smaller,大的賦值給larger

  • index索引從2開始到smaller遍歷,發(fā)現(xiàn)有沒有數(shù)據(jù)可以同時被兩者整除,有則更新數(shù)據(jù)

  • 循環(huán)結(jié)束后,獲取最大的公約數(shù)
int GetMaxCommonDivide(int n, int m)  
{  
    int index;  
    int smaller;  
    int larger;  
    int value;  
    assert(n && m);  

    if(n > m){  
        larger = n;  
        smaller = m;  
    }else{  
        larger = m;  
        smaller = n;  
    }  

    value = 1;  
    for(index = 2; index <= smaller; index++){  
        if(0 == (smaller % index) && 0 == (larger % index))  
            value = index;  
    }  

    return value;  
}  

上面的代碼看似沒有問題,但是還是留下了一個遺憾,如果m和n的數(shù)據(jù)都大于32位,那怎么辦?也許有的朋友會說,現(xiàn)在有64位的cpu。但是如果我們此刻沒有64位的cpu,那該怎么辦呢?

總結(jié):

  • 看似最大公約數(shù)、最小公倍數(shù)是個小問題,但是要寫好不容易,算法、參數(shù)判斷、邏輯都要注意,
  • 如果m和n的數(shù)據(jù)都比較大,有沒有可能利用多核降低計算的復(fù)雜度,
  • 如果m和n中有數(shù)據(jù)大于32位,那該怎么辦?
  • 小問題看似簡單,但是在不同的場景下卻可以變得非常復(fù)雜,作為面試題可以充分考察面試者的溝通能力和應(yīng)變能力。
上一篇:查找下一篇:選擇排序