求解最小公倍數(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ù)
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é):