最大公约数和最小公倍数及二者之间的联系(java)

求两个数的最小公倍数和最大公约数是最基本也是最经典的算法之一。现在我们来介绍一下这两个算法的思想,以及最小公倍数和最大公约数之间的联系(这是很多人忽略的)。最后我们会用java来实现这两个算法。



最大公约数:

求最大公约数一般采用欧几里德算法。
欧几里德算法又称辗转相除法, 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理:
定理: gcd(a, b) = gcd(b, a mod b) //此函数作用是求最大公约数


代码如下:

if(m<n)
{
int t=m;
m=n;
n=t;
}
for(int i=n;i<=m*n;i++)
{
if(i%m==0 && i%n==0)
{

System.out.println("最小公倍数为"+i);

break;

}
}

或者用辗转相减:

public static void main(String[] args) {
System.out.println("(求最大公约数)请依次输入两个数的值:");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
int b = s.nextInt();
System.out.println(a+"和"+b+"的最大公约数是:"+caculate(a,b));
}

private static int caculate(int a, int b) {
while(a != b){
if(a > b){
a = a - b;
}
else{
b = b - a;
}
}
return a;
}



最大公约数:

最大公约数好像就没有例如欧几里得算法这样的现成算法了,那怎么办呢?

别急,因为实际上最大公约数和最小公倍数之间有着某种不可言喻的关系的!!!

假如有a,b两个数。我们把a看成由两部分组成的:a和b的共有部分(最大公约数),a的私有部分。b也看成:a和b的共有部分和b的私有部分。

最大公约数,即是两个数的公共部分(所有);最小公倍数,即是a的私有部分 * b的私有部分 * ab共有部分

最大公约数和最小公倍数及二者之间的联系(java)


所以我们找到了最小公倍数和最大公约数之间的关系:最大公约数 * 最小公倍数 = a * b ;


代码就简单了,只需对之前代码稍加改造:

public static void main(String[] args){
System.out.println("(求最小公倍数)请依次输入两个数的值:");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
int b = s.nextInt();
System.out.println(a+"和"+b+"的最小公倍数是:"+caculate(a,b));
}


private static int caculate(int a, int b) {
int originalA = a;
int originalB = b;
while(a != b){
if(a > b){
a = a - b;
}
else{
b = b - a;
}
}
return originalA*originalB/a;
}