js求n个整数的最大公约数

422 阅读1分钟

1. 题目:

求n个整数的最大公约数 (1 < n < 2^31-1)
提示:0与一个数的最大公约数是这个数本身。


示例1:
给定数组:[3,4,5]
输出:1

示例 2:
给定数组:[0,3]
输出:3

示例 3:
给定数组:[99]
输出:9

示例 4:
给定数组:[066, -44, 88, 12]
输出:2

方法一

2. 思路

1)负数取正
2)数组去重
3)如果数组中只有一个数则返回这个数
4)找到数组中最小的非0项x
5)把所有除x外的项都对x取余,如果没有除x以外的非0项,到76)到47)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;
}