题目
辗转相除法可以求得最大公约数。举个例子演示这个算法的流程,如求1515和600的最大公约数:
第一次:用1515除以600,商2余315;
第二次:用600除以315,商1余285;
第三次:用315除以285,商1余30;
第四次:用285除以30,商9余15;
第五次:用30除以15,商2余0。
所以,1515和600的最大公约数是15。
算法
使用递归算法
/**
* 以递归的方式求最大公约数
*
* @param num1
* @param num2
* @return
*/
public static int getMaxCommonDivisorByRecursion(int num1, int num2) {
//被除数
int dividend = num1 > num2 ? num1 : num2;
//除数
int divisor = num1 < num2 ? num1 : num2;
int remainder = dividend % divisor;
if (remainder == 0) {
return divisor;
} else {
return getMaxCommonDivisorByRecursion(divisor, remainder);
}
}
使用循环算法
/**
* 以循环的方式求最大公约数
*
* @param num1
* @param num2
* @return
*/
public static int getMaxCommonDivisorByCycle(int num1, int num2) {
//被除数
int dividend = num1 > num2 ? num1 : num2;
//除数
int divisor = num1 < num2 ? num1 : num2;
while (true) {
int remainder = dividend % divisor;
if (remainder == 0) {
break;
}
dividend = divisor;
divisor = remainder;
}
return divisor;
}