javascript 求最大公约数

410 阅读1分钟

最近在看一些算法题, 有点菜记录一下

辗转相除法

辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。

// 比如 求 (a, b)
例如,求(319377):
319÷377=0(余319// 在这里 b 变成了 a   b 变成了余数319377)=(377319);
377÷319=1(余58// 接着 b 变成了 a   b 变成了余数  到这里是不是有点类似于递归的赶脚377319)=(31958);
319÷58=5(余29)

(31958)=(5829);
58÷29=2(余0)


(5829)= 29;
(319377)=29

代码实现

function gcd(a, b) {
    if (b === 0) {
        return a
    } else {
        return gcd(b, a % b)
    }
}

更相减损术

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

// 解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
// 所以,98和63的最大公约数等于7。

// 这个过程可以简单的写为:9863)=(3563)=(3528)=(728)=(721)=(714)=(77)=7.
function gcd(a, b) {
    if (a === b) {
        return b
    }
    if (a > b) {
        a = a -b
    } else {
        b = b - a
    }
    return gcd(a, b)
}