1.辗转相除法(也就是欧几里得算法)
public static int method1(int a, int b) {
if (a < b) {
int temp = a;
a = b;
b = temp;
}
if (b == 0) {
return a;
}
int r = a % b;
return method1(b, r);
}
前数大于后数字,两数字的最大公约数<===>后数与前数除以后数的余数的最大公约数<====>递归调用就先行了,直到两数的余数为0,前数就是最大公约数了,最小公倍数等于两数之积除以最大公约数
2.穷举法
public static int method2(int a, int b) {
if (a < b) {
int temp = a;
a = b;
b = temp;
}
int i;
for (i = b; i > 0; i--) {
if (a % i == 0 && b % i == 0) {
break;
}
}
return i;
}
从两数的小的数字开始循环,不断自减,当两数能第一次同时整除该数字的时候,该数字就是两数的最大公约数字,最小公倍数等于两数之积除以最大公约数
3.更相减损法
public static int method3(int a, int b) {
while (true) {
if (a > b) {
a -= b;
} else if (a < b) {
b -= a;
} else {
return a;
}
}
}
以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
这个相等的数字就是最大公约数,最小公倍数等于两数之积除以最大公约数
4.求三个数字的最大公约数和最小公倍数
用第二种穷举法即可,从最小数字开始,递减,当三个数字第一次同时整除该数字的时候,该数字就是最大公约数,最小公倍数可以从最大数字开始递增,当该数字第一次同时整除给定的三个数字的时候,该数字就是最小公倍数,也可以求前两个数字的最小公倍数之后,再拿该数字与第三个数字求最小公倍数,算法参考以上三种.
个人分析: 穷举法:非常容易理解,就是从最大公约的本质进行求解的,但是其实算法是很低级的
将更相减损法和辗转相除法进行结合同时结合移位操作,是最高效的求解最大公约数字的方法