1. 题目:
求n个整数的最大公约数 (1 < n < 2^31-1)
提示:0与一个数的最大公约数是这个数本身。
示例1:
给定数组:[3,4,5]
输出:1
示例 2:
给定数组:[0,3]
输出:3
示例 3:
给定数组:[9,9]
输出:9
示例 4:
给定数组:[0,66, -44, 88, 12]
输出:2
方法一
2. 思路
1)负数取正
2)数组去重
3)如果数组中只有一个数则返回这个数
4)找到数组中最小的非0项x
5)把所有除x外的项都对x取余,如果没有除x以外的非0项,到7)
6)到4)
7)x就是数组的最大公因数
3. 实现代码
var maxDivi = function(arr) {
// 负数取正
arr.forEach((item, index, arr) => {
arr[index] = Math.abs(item);
});
// 去重
arr = Array.from(new Set(arr));
// 如果数组中只有一个数则返回这个数
if (arr.length === 1) {
return arr[0];
}
while (!this.howMuchZero(arr)) {
// 取最小非零数
const min = this.getMin(arr);
// 对min取余
arr = arr.map((item) =>
item === min ? item : item % min
);
}
return this.getMin(arr);
};
// 找到数组中最小的非零项
getMin(arr) {
let min = Infinity;
arr.forEach(function (item) {
if (item < min && item !== 0) {
min = item;
}
});
return min;
},
// 如果只有一个非零数,就返回true
howMuchZero(arr) {
let zerocount = 0;
arr.forEach(function (item) {
if (item === 0) {
zerocount++;
}
});
if (zerocount === arr.length - 1) {
return true;
} else {
return false;
}
}
方法二
2. 思路
辗转相除法求最大公因数,
1)负数取正
2)数组去重
3)使用辗转相除法求第一个数与第二个数的最大公因数,其结果再与第三个数求,以此类推,至最后一个数
3. 实现代码
var maxDivi1 = function(arr) {
// 负数取正
arr.forEach((item, index, arr) => {
arr[index] = Math.abs(item);
});
// 去重
arr = Array.from(new Set(arr));
let res = arr[0];
for (let i = 0; i < arr.length - 1; i++) {
res = this.gcd(res, arr[i + 1]);
}
return res;
};
// 辗转相除法
gcd(a, b) {
return b !== 0 ? this.gcd(b, a % b) : a;
}