最近在看一些算法题, 有点菜记录一下
辗转相除法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
// 比如 求 (a, b)
例如,求(319,377):
319÷377=0(余319)
// 在这里 b 变成了 a b 变成了余数
(319,377)=(377,319);
377÷319=1(余58)
// 接着 b 变成了 a b 变成了余数 到这里是不是有点类似于递归的赶脚
(377,319)=(319,58);
319÷58=5(余29)
(319,58)=(58,29);
58÷29=2(余0)
(58,29)= 29;
(319,377)=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。
// 这个过程可以简单的写为:
(98,63)=(35,63)=(35,28)=(7,28)=(7,21)=(7,14)=(7,7)=7.
function gcd(a, b) {
if (a === b) {
return b
}
if (a > b) {
a = a -b
} else {
b = b - a
}
return gcd(a, b)
}