我們在小學時候就學過好幾種求最大公約數的方法:輾轉相除法,更相減損法,短除法。
輾轉相除法:是用較大的數除以較小的數。如果整除則較小的數就是這兩個數的最大公約數,如果沒有的話,就用較小的數和餘數中大的數除以兩個數中較小的數,直至整除爲止,最後的除數就是最大公約數。
更相減損法:先判斷兩個數是否爲偶數,如果是的話先除以2,然後較大的數減去較小的數,直到減數和值相等爲止。最後的值再乘以約掉的2的個數再乘以2。
輾轉相除的代碼如下:
public int maxNumber(int numberOne, int numberTwo) { if (numberOne == numberTwo) return numberOne; if (numberOne < numberTwo) return maxNumber(numberTwo, numberOne); else { if (numberOne % numberTwo == 0) return numberTwo; else return maxNumber(numberTwo, numberOne % numberTwo); } }
更相減損法的代碼如下:
public int getMaxNumebr(int numberOne, int numberTwo) { if (numberOne == numberTwo) return numberOne; if (numberOne < numberTwo) return getMaxNumebr(numberTwo, numberOne); else { if ((numberOne & 1) != 1 && (numberTwo & 1) != 1) return getMaxNumebr(numberOne >> 1, numberTwo >> 1) << 1; else if ((numberOne & 1) == 1 && (numberTwo & 1) != 1) return getMaxNumebr(numberOne >> 1, numberTwo); else if ((numberOne & 1) == 1 && (numberTwo & 1) != 1) return getMaxNumebr(numberOne,numberTwo>>1); else return getMaxNumebr(numberTwo,numberOne-numberTwo); } }
第二種方法比第一種好,因爲第一種取模較爲消耗。