简谈求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]);
        }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值