arrayGcd
求最大公约数
const arrayGcd = arr =>{
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return arr.reduce((a,b) => gcd(a,b));
}
// arrayGcd([1,2,3,4,5]) -> 1
// arrayGcd([4,8,12]) -> 4
常见面试题 上面用的辗转相除法,即相互取余,知道最后一方为0,取另一方。
麻烦点的写法
var arrayGcd = function(arr) {
function gcd(x, y) {
return !y ? x : gcd(y, x % y)
}
var result = arr[0];
for(var i = 0, length = arr.length; i < length; i++) {
result = gcd(result, arr[i])
}
return result
}
还有一种方法叫做更相减损法 先两边共同把公约数2除完,然后相减与最小数比较 知道相等 在算出最先出来的2余其乘积
var arrayGcd = function(arr) {
function gcd(x, y, z = 0) {
if(!(x % 2 || y % 2)) {
return gcd(x/2, y/2, z+1)
}
return x === y ? x*Math.pow(2, z) : gcd(Math.min(x, y), Math.abs(x - y), z)
}
var result = arr[0];
for(var i = 0, length = arr.length; i < length; i++) {
result = gcd(result, arr[i])
}
return result
}
我们试着让他简化一点
const arrayGcd = (arr) => {
const gcd = (x, y, z = 1) => x === y ? x * z : x % 2 || y % 2 ? gcd(Math.min(x, y), Math.abs(x - y), z) : gcd(x/2, y/2, z*2)
return arr.reduce((a,b) => gcd(a,b));
}
嗯··· 还是有点长····
arrayLcm
最小公倍数
应用定理 最大公约数 * 最小公倍数 = 两数乘积
所以
const arrayLcm = arr =>{
const gcd = (x, y) => !y ? x : gcd(y, x % y);
const lcm = (x, y) => (x*y)/gcd(x, y);
return arr.reduce((a,b) => lcm(a,b));
}
这个就简单了
网友评论