辗转相除法又名欧几里德算法。
他是已知最古老的的算法哦~
原理
* 引入
设有整数a,b,他们可以表示为:
a = m1k+n1
b = m2k+n2
易得
(a+b) % k
= (m1k+m2k) % k + (n1+n2) % k
= (n1+n2) % k
由上式可得,对两数之和求余,对他们的和求余与分别求余在相加是没有啥区别的
* 正题
辗转相除法可看作上述的一种特殊情况,
a = m1k
b = m2k
(a-b) % k = (m1k-m2k) % k
故,如果一个数能够除开(a-b),也一定能除开a,b
推出gcb(a,b) = gcb(a%b,b)
代码实现
public class Division {
public static void main(String[] args)
{
System.out.println(f(12,18));//循环 最大公约数
System.out.println(f1(12,18));//递归 最大公约数
System.out.println(12*18/f1(12,18));// 最大公倍数=a*b/gcb(a,b)
}
public static int f(int m,int n)
{
while(m != 0)
{
int temp = m;
m = n % m;
n = temp;
}
return n;
}
public static int f1(int m,int n)
{
if(m ==0)
return n;
else
return f1(n%m,m);
}
}