javascript来计算最大公约数和最小公倍数

简介: 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。

以上为概念,为什么讲这个问题呢?请看这里...codewars-js-刷题

下面只说几个常用的实现思路:

  • 通过程序轮询获得最大公约数(在不知道算法的情况下...)
  • 辗转相除法(欧几里得算法)
  • 辗转相减法(更相减损法)

普通轮询

function gcd(a,b){
    var div = 1,max = Math.max(a,b),min = Math.min(a,b);
    for(let i=1;i<min;i++){
        if(max % i === 0 && min % i === 0){
            div = i;
        }
    }
    return div;
}

我们通过遍历最终获得一个最大的公约数。当然遍历顺序也可以反过来,这样步骤会相对少一部分的。

function gcd(a,b){
    var div = 1,max = Math.max(a,b),min = Math.min(a,b);
    for(let i=min;i>=1;i--){
        if(max % i === 0 && min % i === 0){
            div = i;
            break;
        }
    }
    return div;
}

辗转相除法

function gcd(a,b){
  if(b === 0)return a;
  return gcd(b,a % b);
}

通过相除然后递归获得最终的最大公约数,当然也可以简写..

const gcd= (a, b) => b ? gcd(b, a % b) : a;

辗转相减法

function gcd(a,b){
    var p = Math.abs(a - b ),min = Math.min(a,b);
    if(min % p === 0)return p;
    return gcd(min,p);
}

以上三种方式可以通过js来获得两个数的最大公约数。当我们有了最大公约数后,就可以通过最大公约数获得两个数的最小公倍数。

[a,b] = a * b / (a,b)
a 与 b的最小公倍数等于 a与b的乘积 除以 a与 b的最大公约数。

最小公倍数

const gcd = (a, b) => b ? gcd(b, a % b) : a;//获得ab 的最大公约数
const lcm = (a, b) => a * b / gcd(a, b);//获得ab的最小公倍数

顺便,这里再贴下关于这道题的解法:

const gcd = (a, b) => b ? gcd(b, a % b) : a;
const lcm = (a, b) => a * b / gcd(a, b);

function convertFrac(arr) {
  const cd = arr.reduce((a, [_, d]) => lcm(d, a), 1);
  return arr.map(([n, d]) => `(${n * cd/d},${cd})`).join('');
}
//声明下,这个解法并不是我的。

以上为通过js来计算两个数的最大公约数和最小公倍数的实现方式。

相关文章
|
4月前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
4月前
|
JavaScript 前端开发 大数据
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
|
4月前
|
JavaScript
|
4月前
|
存储 移动开发 JavaScript
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(1)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(1)
75 0
|
1天前
|
JavaScript
js计算时间差,包括计算,天,时,分,秒
js计算时间差,包括计算,天,时,分,秒
35 16
|
4月前
|
缓存 JavaScript 前端开发
Vue.js计算属性:实现数据驱动的利器
Vue.js计算属性:实现数据驱动的利器
|
2月前
|
JavaScript
js 精确计算(解决js四则运算精度缺失问题)
js 精确计算(解决js四则运算精度缺失问题)
81 0
|
2月前
|
前端开发
大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)
大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)
320 0
|
2月前
|
JavaScript 前端开发
js/javascript 操作时间日期【全】含时间日期的创建、获取、比较、计算、格式化、时间戳、昨天、今天、星期汉化、计时、相关插件等
js/javascript 操作时间日期【全】含时间日期的创建、获取、比较、计算、格式化、时间戳、昨天、今天、星期汉化、计时、相关插件等
77 0
|
3月前
|
JavaScript 前端开发 小程序
老程序员分享:js中自然日的计算
老程序员分享:js中自然日的计算
39 0