概述
首先做这个题需要先复习几组概念:
- 如果数
a
能被数b
整除,a
就叫做b
的倍数,b
就叫做a
的约数。 - 几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。
举例:
12,16
12的约数有:1,2, 3, 4, 6, 12
16的约数有:1, 2, 4, 8, 16
故而最大的公约数为4。
求最大公约数有多种方法,常见的有辗转相除法。
1. 朴素解——暴力求解
观察性质或者案例,我们可以知道最大公约数一定满足(对于数A
和数B
来说,最大公约数C
),A%C=0
且B%C=0
。且最大。
那么我们可以从后往前暴力遍历即可,且开始的位置为较小的那个数。
private static int getMaxCommonDivisor(int a, int b) {
// 使a小,b大
if(a > b){
// 两个数交换
a = a + b;
b = a - b;
a = a - b;
}
int temp = a;
while(temp > 0){
if(a % temp == 0 && b % temp == 0){
break;
}
temp--;
}
return temp;
}
这里注意到两个数交换的写法,这里使用的的是加减来做。原理为x = x + y - x
,以达到交换目的。
所以数x和数y的交换可以写为:
x = x + y;
y = x - y;
x = x - y;
类似的,在位运算中,可以使用:x = x ^ y ^ x
来达到交换的目的,因为异或运算相同为0,故而可以达到。
所以数x和数y的交换可以写为:
x = x ^ y;
y = x ^ y; // y = x
x = x ^ y; // x = y
2. 辗转相除法
这里为了直观直接拷贝百度百科的图片:
这里举个例子:1997 和 615
- 首先取较大数为被除数,即
1997
,615
为除数,得到余数152
; - 将上轮的除数
615
作为本轮的被除数,上轮的余数152
为本轮的除数,得到余数7
; - 重复这个过程,直到余数为
0
; - 此时返回本轮的被除数的值。
故而可以写出如下代码:
private static int getMaxCommonDivisor(int a, int b) {
// 使 a < b 成立
if(a > b){
a = a + b;
b = a - b;
a = a - b;
}
int yu = 0;
do{
yu = b % a;
b = a;
a = yu;
}while (yu != 0);
return b;
}
最后
以上就是称心蛋挞为你收集整理的【Java】求最大公约数1. 朴素解——暴力求解2. 辗转相除法的全部内容,希望文章能够帮你解决【Java】求最大公约数1. 朴素解——暴力求解2. 辗转相除法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复