求m和n的最大公约数
1:穷举算法,检测k(k>2)到m和n的最小数之间的数是否是m和n的公约数,假设n<m
public static int gcd(int m, int n) {
for (int k = 2; k <= n; k++) {
if (m % k == 0 && n % k == 0) {
gcd = k;
}
}
return gcd;
}
2:在算法1的基础上进行改进,改进的部分在于不从1向上查找可能的除数,而是从m和n之间最小数开始向下查找,一旦找到 则是最大公约数
public static int gcd1(int m, int n) {int gcd = 1;
if (m % n == 0)
return n;
for (int k = n; k >=1; k--) {
if (m % k == 0 && n % k == 0) {
gcd = k;
break;
}
}
return gcd;
}
3:在算法2的基础上进行改进 我们知道数字n的除数不可能比n/2大
public static int gcd2(int m, int n) {
int gcd = 1;
if (m % n == 0)
return n;
for (int k = n/2; k >= 1; k--) {
if (m % k == 0 && n % k == 0) {
gcd = k;
break;
}
}
return gcd;
}
4:辗转相除法,也成欧几里得算法
//递归实现
public static int gcd3(int m, int n) {
if (m % n == 0){
return n;
}
else{
int x=m;
m=n;
n=x%n;
return gcd3(m, n);
}
}
//循环实现
public static int gcd4(int m, int n) {
int k = 0;
do {
k = m % n;
m = n;
n = k;
} while (k != 0);
return m;
}