简谈求2个及多个数字的最小公倍数(LCM)和最大公约数(GCD)

问题一:求两个数字的最大公约数(GCD)及其最小公倍数(LCM)

问题二:求任意个数字的最大公约数(GCD)及其最小公倍数(LCM)

其实问题二就是问题一的重复与递归形式。相信大家都了解过很多求GCD和LCM的方法,但个人最推荐辗转相除法(即欧几里得算法),思想简单,代码简短易于理解。

本文先看两个数字的GCD与LCM的代码和问题二的代码。涉及到原理,想仔细看任意个数字的GCD与LCM的请点击上方蓝字部分。

第一种:这种代码是中规中矩的非递归形式,可以认为是两个参数不断地变换然后向左移位。(自行领会一下)

public static int GCD(int a, int b) {
	while(b!=0) {
		int temp = b;//借助temp这个中间变量来暂存b的原始值
		b = a%b;//辗转相除法精髓,可理解为不断相除
		a = temp;//还原b的值
	}
	return a;
}

第二种:为递归形式,但其实原理相同,如果你不懂运算符的话就自己去补一下吧,链接给到

https://baike.baidu.com/item/三目运算符/6434591?fr=aladdin

public static int GCD(int a, int b) {
	return b==0?a:GCD(b,a%b);
}

众所周知,LCM = (a * b)  /  GCD( a , b );   代码如下:

public static int LCM(int a, int b) {
	return a*b/(GCD(a, b));
}

对于任意数量的数字求GCD与LCM,可以用for循环递归来完成,下面的代码同样可以解决问题一。如果想看完整代码请点击顶部蓝字部分链接。

static int GCD(int[] num) {
	int n = num.length;
	int g = a[0];
	for(int i = 1;i < n;i++){
             g = GCD(g,num[i]);
        }  
	return g;
}

static int LCM(int[] num) {
	int n = num.length;
	int l = num[0];
	for(int i = 1;i < n;i++){
	    l = LCM(l,num[i]);
        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章