输入两个正整数m和n,求其最大公约数和最小公倍数。
package Demo06GCD;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Greatest_Common_Divisor {
/**
* 输入两个正整数m和n,求其最大公约数和最小公倍数。
*/
/*
分析:最大公约数指两个或多个整数共有约数中最大的一个。
常见的求最大公约数有多种方法有质因数分解法、短除法、辗转相除法、更相减损法。
这几种方法都是数学方法,在了解了其原理之后,用计算机编程语言来完成,就简单了,
我选一个咱国产的:更相减损法,该方法的操作是:
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
*/
public static void main(String[] args) {
// 通过Scanner对象来获取用户输入
while (true) {
int num1 = 0;
int num2 = 0;
try {
System.out.println("请输入第一个数:");
Scanner sc = new Scanner(System.in);
num1 = sc.nextInt();
System.out.println("请输入第二个数;");
num2 = sc.nextInt();
// 判断两个数的大小,分别装到big和small变量里面
int big = 0;
int small = 0;
if (num1 < num2) {
small = num1;
big = num2;
} else if (num1 > num2) {
small = num2;
big = num1;
} else {
System.out.println("输入有误,请重新输入……");
}
int halfs = 1;
int flag = 0;
// 如果两个数是偶数,则除以2,一直除到有一个不是偶数为止
while (big % 2 == 0 && small % 2 == 0) {
big /= 2;
small /= 2;
halfs *= 2;
}
// 减损,拿大数减小数,一直减到减数等于差
while (big - small > 0) {
flag = big - small;
big = flag > small ? flag : small;
small = flag < small ? flag : small;
}
// 返回最大公约数,即halfs*flag
System.out.println("您输入的两个数的最大公约数为:" + (halfs * flag));
} catch (InputMismatchException e) {
System.out.println("您输入的数据有误,请输入输入数字:");
}
}
}
}