解题思路:
1、辗转相除法: 取两个数中较大的数做被除数, 较小的数为除数; 用较大的数去除以较小的数,若余数为0,则较小数就是这两个数的最大公约数;如果不为0,则用除数去除以上一步计算出的余数, 直到余数为0,则这两个数的最大公约数为上一步的余数。
代码实现:
// m > n
function calcGCD(m, n) {
//求最大公约数
let u = m;
let v = n;
while (v != 0) {
[u, v] = [v, u % v];
}
return u;
}
2、相减法: 取两个数中较大的数做被减数, 较小的数为减数; 用较大的数去减去较小的数,若差为0,则较小数就是这两个数的最大公约数;如果不为0,用减数和上一步计算出的差中较大值减去较小值, 直到差为0,则这两个数的最大公约数为最后一次的减数。
// m > n
function calcGCD(m, n) {
//求最大公约数
let u = m;
let v = n;
let diff = v;
while (u - v != 0) {
if ( u -v < v) {
[u, v] = [ v, u - v];
} else {
[u, v] = [u - v, v];
}
}
return v;
}