求解最小公倍數和最大公約數是我們開始程式設計的時候經常需要練習的題目。從題面上看,好像我們需要求解的是兩個題目,但其實就是乙個題目。那就是求最大公約數?為什麼呢?我們可以假想這兩個數m和n,假設m和n的最大公約數是a。那麼我們可以這樣寫:
m = b *a;
n = c * a;
所以m和n的最小公倍數就應該是a*b*c啊,那不就是m * n / a,其中m和n是已知的,而a就是那個需要求解的最大公約數。所以就有了下面的**,
[cpp]view plain
copy
intgetmincommonmultiple(
intm,
intn)
歐幾里得法。歐幾里得法構思十分巧妙,它利用了m、n和n、m%n之間的最大公約數是相等的這一重要條件,充分利用替換的方法,在 m%n等於0的那一剎那,獲得我們的最大公約數。然而,我們平時自己所能想到的方法卻不多,下面的方法就是具有典型意義的一種:
a) 首先對資料m和n判斷大小,小的賦值給smaller,大的賦值給larger
b)index索引從2開始到smaller遍歷,發現有沒有資料可以同時被兩者整除,有則更新資料
c)迴圈結束後,獲取最大的公約數
[cpp]view plain
copy
intgetmaxcommondivide(
intn,
intm)
else
value = 1;
for(index = 2; index <= smaller; index++)
return
value;
} 上面的**看似沒有問題,但是還是留下了乙個遺憾,如果m和n的資料都大於32位,那怎麼辦?也許有的朋友會說,現在有64位的cpu。但是如果我們此刻沒有64位的cpu,那該怎麼辦呢?
總結:(1)看似最大公約數、最小公倍數是個小問題,但是要寫好不容易,演算法、引數判斷、邏輯都要注意,
(2)如果m和n的資料都比較大,有沒有可能利用多核降低計算的複雜度,
(3)如果m和n中有資料大於32位,那該怎麼辦?
(4)小問題看似簡單,但是在不同的場景下卻可以變得非常複雜,作為面試題可以充分考察面試者的溝通能力和應變能力。
一步一步寫演算法(之 最大公約數 最小公倍數)
原文 一步一步寫演算法 之 最大公約數 最小公倍數 求解最小公倍數和最大公約數是我們開始程式設計的時候經常需要練習的題目。從題面上看,好像我們需要求解的是兩個題目,但其實就是乙個題目。那就是求最大公約數?為什麼呢?我們可以假想這兩個數m和n,假設m和n的最大公約數是a。那麼我們可以這樣寫 m b a...
一步一步寫演算法(開篇)
演算法是計算機的生命。沒有演算法,就沒有軟體,計算機也就成了乙個冰冷的機器,沒有什麼實用價值。很多人認為,演算法是數學的內容,學起來特別麻煩。我們不能認為這種觀點是錯誤的。但是我們也知道,軟體是一種復合的技術,如果乙個人只知道演算法,但是不能用程式語言很好地實現,那麼再優秀的演算法也不能發揮作用。乙...
一步一步寫演算法(開篇)
演算法是計算機的生命。沒有演算法,就沒有軟體,計算機也就成了乙個冰冷的機器,沒有什麼實用價值。很多人認為,演算法是數學的內容,學起來特別麻煩。我們不能認為這種觀點是錯誤的。但是我們也知道,軟體是一種復合的技術,如果乙個人只知道演算法,但是不能用程式語言很好地實現,那麼再優秀的演算法也不能發揮作用。乙...