求两个自然数的最大公约数
方法一:用短除法找出这两个自然数的所有公因子,将这些公因子相乘,得到这两个数的最大公约数
function getGDC(m,n){
var gdc=1;
for(var i=2;i<=m&&i<=n;i++){
while(m%i==0&&n%i==0){
gdc=gdc*i;
m=m/i;
n=n/i;
}
}
return gdc;
}
方法二:用欧几里得算法,其基本思路是将两个数辗转相除直到余数为0
function getGDC(m,n){
var r=m%n;
while(r!=0){
m=n;
n=r;
r=m%n;
}
return n;
}
/*使用递归代替循环
function getGDC(m,n){
if(m%n==0){
return n;
}
else{
return getGDC(n,m%n);
}
}*/
证明欧几里得算法
证明 GDC(a,b)=GDC(b,a mod b),其中a>b
令 r=a mod b,a可以被表示为 a=k* b+r ,r可以被表示为 r=a-k* b
假设d为(a,b)的一个公约数,即a和b都可以被d整除,则有 r/d=a/d-k *b/d
由等式右边可知 r/d 是一个整数,即d是r的一个约数,d是(b,a mod b)的一个公约数
因为(a,b)和(b,a mod b)的公约数相等,其最大公约数也相等
在编写代码时不用考虑让较大的数做被除数,较小的数做除数,因为若被除数小于除数,则余数为被除数,下次计算时的被除数就是较大数,除数是较小数。相较于被除数大于除数的情况只多了一次计算。