最近脑子突然冒出一个有趣的想法,怎么求最大公约数和最小公倍数。看来网上的一些算法,下面算是自己的一些理解吧。
辗转相除法:就是用小数除大数,如果余数不是零,就把余数和较小的数构成一组新数,继续上面的除法,知道大数被小数约尽,此时比较小的数就是最大公约数。
1
2
3
4
5
6
7
8
9var maxCommon = function (a, b) {
var c = a % b;
while (c != 0) {
a = b;
b = c;
c = a % b;
}
return b;
};更相减损法:用大数减去小数,将差和较小的数构成一对新数,再用大数减去小数 一直到差与较小数相等 此时差就是最大公约数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18var maxCommon = function (a, b) {
while (a != b) {
var m = Math.min(a, b);
var n = Math.abs(a - b);
return maxCommon(m, n); //要加return,返回给上一层
}
return a;
};
//或
var maxCommon = function (a, b) {
if (a != b) {
var m = Math.min(a, b);
var n = Math.abs(a - b);
return maxCommon(m, n); //这里也要加return,返回给上一层
} else {
return a;
}
};以上加 return 的原因应该是,对于有返回值的函数的递归调用一定要记得加 return
穷举法,遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14var maxCommon = function (a, b) {
var c;
if (a < b) {
c = a;
a = b;
b = c;
}
for (var i = 1; i <= b; i++) {
if (a % i == 0 && b % i == 0) {
c = i;
}
}
return c;
};当然还有其他算法,有兴趣的朋友可以可以自己去研究下。
既然我们都取到了公约数,那公倍数就是在是太简单了。将两个数相乘除以最大公约数即可。
1
2
3
4
5var minCommon = function (a, b) {
var c = maxCommon(a, b);
var d = (a * b) / c;
return d;
};
[越努力,越幸运!]