用java实现欧几里得算法求两个数字的最大公约数

时间:2022-09-08 09:46:38

最大公约数

最大公约数的定义是两个不全为0的非负整数m和n的最大公约数记为gcd(m , n),代表能够整除(即余数为0)的最大整数。

欧几里得算法原理:

1.如果n == 0,则m就是最大公约数
2.如果n != 0,用m去除以n得到模k,将n赋值给m,将k赋值给n,直到n == 0

实现代码如下

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
*
* 欧几里得算法,求两个数的最大公约数
*/
public class Euclid {

public static void main(String args[]) {
// 从控制台输入两个数
BufferedReader bfi = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入两个数字,已空格分隔,按Enter确定:");
String euclidString;
String[] euclidStringArray = new String[2];
try {
euclidString = bfi.readLine();
euclidStringArray = euclidString.split(" ");
if (euclidStringArray.length <= 1 || euclidStringArray.length > 2) {
System.out.println("请输入两个数字!");
return;
}
} catch (IOException e) {
System.out.println("输入异常!");
e.printStackTrace();
}
int[] euclidIntArray = new int[2];
for (int i = 0; i < euclidStringArray.length; i++) {
euclidIntArray[i] = Integer.parseInt(euclidStringArray[i]);
}
int maxCommonDivisor = getMaxCommonDivisor(euclidIntArray);
System.out.println("最大公约数是 :\n" + maxCommonDivisor);
}

private static int getMaxCommonDivisor(int[] array) {
int tmp = 0;
// 排序,确保第一个数字大于第二个,当array过大时可以选择用排序算法
if (array[1] > array[0]) {
tmp = array[0];
array[0] = array[1];
array[1] = tmp;
}
// 欧几里得算法,两个数字求模,然后将第二个数字赋值给第一个数子,将模赋值给第二个数字,直到第二个数为0,则此时第一个数为最初两个数字的最大公约数
while (array[1] != 0) {
tmp = array[0] / array[1];
array[0] = array[1];
array[1] = tmp;
}
return array[0];
}

}