算法——最大公约数

百度百科上介绍的最大公约数的求法(限两个数)主要有两种:辗转相除法和更相减损法。

辗转相除法

辗转相除法,百度百科上的示例:

用(a,b)表示a和b的最大公约数。

例如,求(319,377):

∵ 319÷377=0(余319)

∴(319,377)=(377,319);

∵ 377÷319=1(余58)

∴(377,319)=(319,58);

∵ 319÷58=5(余29),

∴ (319,58)=(58,29);

∵ 58÷29=2(余0),

∴ (58,29)= 29;

∴ (319,377)=29.

也就是说,求两个数的最大公约数时,先用较大数除以较小数,如果能整除,最大公约数就等于较小数;否则用较小数除以第一步的余数,如果能整除,最大公约数就等于第一步的余数;否则,用当前获得的余数除以上一步的余数,直到能整除为止。此时作为除数的那个数就是最开始那两个数的最大公约数。

下面是代码:

 1 function gcm(m,n) {
 2    var a, c, e, f;
 3    //对m,n排序,较小的在前,较大的在后
 4    if(m > n) {
 5       a = m;
 6       m = n;
 7       n = a;
 8    }
 9    c = m, e = n, f = c;
10    while(c !== 0) {
11       f = e % c;
12       e = c;
13       c = f;
14    }
15    alert(e);
16    return e;
17 }

代码中主要是while循环那里有点绕。(参考知乎上的答案

更相减损法

百度百科上的解释:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

用第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

例1、用更相减损术求98与63的最大公约数。

解:由于63不是偶数,把98和63以大数减小数,并辗转相减:

98-63=35

63-35=28

35-28=7

28-7=21

21-7=14

14-7=7

所以,98和63的最大公约数等于7。

例2、用更相减损术求260和104的最大公约数。

解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。

此时65是奇数而26不是奇数,故把65和26辗转相减:

65-26=39

39-26=13

26-13=13

所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。

下面是代码:

 1 function gcm2(m,n) {
 2    var a, c, e, f, index = 0;
 3    //对m,n排序,较小的在前,较大的在后
 4    if(m > n) {
 5       a = m;
 6       m = n;
 7       n = a;
 8    }
 9    //如果m,n都为偶数
10    while(m % 2 === 0 && n % 2 === 0) {
11       m = m/2;
12       n = n/2;
13       index++;
14    }
15
16    f = m, e = n, c = n - m;
17    while(c !== f) {
18       e = f;
19       f = c;
20       c = e - f;
21       if(c < 0) {
22          c = -c;
23       }
24    }
25    alert(f*2*index);
26    return f*2*index;
27 }

计算上辗转相除法以除法为主,更相减损法以减法为主。计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。

要求多个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。

求多个数的最小公倍数

两个数的最小公倍数等于这两个数的乘积除以这两个数的最大公约数。

求多个数的最小公倍数时,可以先求出其中两个数的最小公倍数,再求这两个数的最小公倍数与第三个数的最小公倍数,以此类推,直到最后一个数为止。最后得到的最小公倍数就是这几个数的最小公倍数。

下面是代码:

 1 function smallestCommons(arr) {
 2   arr = arr.sort(function(a,b) {
 3     return a-b;
 4   });
 5   var brr = [];
 6   for (var i = arr[0]; i <= arr[1]; i++) {
 7      brr.push(i);
 8   }
 9   var m,n,c,e,f;
10
11   for (var i = 0; i < brr.length; i++) {
12
13      if(brr[i] <=  brr[i+1]) {
14        m = brr[i];
15        n = brr[i+1];
16      } else {
17        m = brr[i+1];
18        n = brr[i];
19      }
20
21
22     //求两个数的最大公约数
23      c = m, e = n, f = c;
24      while(c !== 0) {
25       f = e % c;
26       e = c;
27       c = f;
28      }
29
30      //求两个数的最小公倍数
31      var d = m * n / e;
32      //alert(d);
33      brr.splice(0,2,d);
34
35
36      if(brr.length === 1) {
37       num = d;
38       break;
39      }
40      i = -1;
41   }
42
43   console.log(num);
44   return num;
45 }

函数smallestCommons()接收一个数组参数,这个数组包含两项,这个函数的作用是找出这两项之间连续数字的最小公倍数,最后返回这个最小公倍数。

比如:

smallestCommons([1, 13]);//返回 360360。
时间: 2024-07-31 14:34:55

算法——最大公约数的相关文章

[算法]最大公约数和最小公倍数

基于辗转相除的算法实现的基于javascript的最大公约数(GCD)与最小公倍数(LCM)算法. function gcd(m, n){ var c = n % m; if(c)return arguments.callee(c, m); else return m; } function lcm(m, n){ return m/gcd(m,n)*n; }

算法-最大公约数

最大公约数是一个很经典的数学问题,对于这个问题有四种通用的解法,质因数分解法,短除法,不过比较常用的还是辗转相除法,算法出自于欧几里的著作<几何原本>,还有一个就是出自<九章算术>的更相减损法,一般实现的时候都是通过辗转相除法实现,基本的逻辑是这样的:假设把a和b的最大公约数表示成为f(a,b),并且a>=b>0.现在取k=a/b,m=a%b,则a=k*b+m,变形为m=a - k*b:x和y能被f(a,b)整除,那么m也能被f(a,b)整除,f(a,b) = f(b,

常用算法

快速排序 维基百科详细说明 public static void QuickSort(int[] numbers, int left, int right) { if (left < right) { int middle = numbers[(left + right) / 2]; int i = left - 1; int j = right + 1; while (true) { while (numbers[++i] < middle) { } while (numbers[--j]

FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)

[TOC] 说在前面 这是要一篇非常简单的新手能看懂的文章,希望你喜欢.由于在 freecodecamp 中貌似!?无法使用 ES6 的某些语法,未测试具体.所以基本上用古老?!的ES5,4写成,谢谢.在写本博文前没有参考过别人的做法,纯手打,我的方法肯定不是最好,只是以我自己喜欢的方式在写而已. 纯原创,转载请联系作者https//:[email protected].[email protected]. freecodecamp China 不明白API请参考MDN给出的解释 个别题目没有判

[读书笔记]数学之美里的机器学习

这几天陆陆续续把吴军博士的<数学之美>看完了. 整体来说,<数学之美>是一本非常适合于数学不好的人入门机器学习和理解计算机算法原理的科普书.作者结合他多年搞研究和在GOOGLE的经验,把他所理解的机器学习/自然语言处理的发展史一一得梳理了出来,颇有提纲挈领的功效. 在看完这本书后,可以按着里面的线索再去搜相关资料来看,比以前直接上手就看数据挖掘.算法啥的靠谱多了.作者在书里多次推崇[简单的数学模型可以做大事],[换个思路],[做搜索的人要经常研究一下不好的结果/异常值分析],[道]

常见算法:C语言求最小公倍数和最大公约数三种算法

最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去运行① 比如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0

公约数算法

/* 对于已知的两个自然数m, n,假设m>n 计算m除以n,将得到的余数记做r 如果r=0,则此时的n为求得的最大公约数.否则,将n的值保存在m中,将r的值保存在n中, 重复执行下去. */ //欧几里得->辗转相除法 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <iostream> #include &l

算法 - 求两个自然数的最大公约数(C++)

placeholder算法 - 求两个自然数的最大公约数(C++),布布扣,bubuko.com

最大公约数(Gcd)算法(Euclid)

转载自农夫三拳的一篇文章 欧几里德算法和扩展欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d|b , d|r ,但是a = kb + r 因