输入任意两个整数,输出他们的最大公约数和最小公倍数
package com.qianfeng.day04;
import java.util.Scanner;
public class Work04 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a,b; //输入的两个数
int as,bs; //备份两个数
System.out.print("请您输入两个整数:");
a = input.nextInt();
b = input.nextInt();
as = a;
bs = b;
//方法一:穷举法
System.out.println("方法一: 穷举法");
for(int i = (a>b?b:a); i >= 1; i--) {
if(a % i == 0 && b % i == 0) {
System.out.println("最大公因数为:" + i);
break;
}
}
for (int i = (a>b?a:b); i <= a*b; i++) {
if(i % a == 0 && i % b == 0) {
System.out.println("最小公倍数为:" + i + "\n");
break;
}
}
//方法二:相减法
int sum; //两数之和
sum = a * b;
System.out.println("方法二:相减法");
while (true) {
if(a != b) {
if (a > b) {
a = a - b;
} else {
b = b - a;
}
} else {
break;
}
}
System.out.println("最大公因数为:" + a);
System.out.println("最小公倍数为:" + sum/a + "\n");
//方法三:辗转相除法
System.out.println("方法三:辗转相除法");
int remainder1,remainder2 = 1,remainder = 1; //用于储存余数
int max,min; //储存两个数的最大和最小值
int gcd,lcm; //分别代表最大公因数和最小公倍数
max = as>bs?as:bs;
min = as<bs?as:bs;
remainder1 = max % min;
if (remainder1 != 0) {
remainder2 = min % remainder1;
}
if (remainder1 == 0) {
gcd = min;
} else if(remainder2 == 0) {
gcd = remainder1;
} else {
while(remainder != 0) {
remainder = remainder1 % remainder2;
remainder1 = remainder2;
remainder2 = remainder;
}
gcd = remainder1;
}
lcm = sum/gcd;
System.out.println("最大公因数为:" + gcd);
System.out.println("最小公倍数为:" + lcm + "\n");
input.close();
}
}
解释:
方法一:穷举法
最大公因数的取值范围一定在,1到两个数之间小的那一个范围内
最小公倍数的取值方位一顶在,两个数之间最大的哪一个到两数相乘范围内
然后直接通过i++的方式寻找,进行枚举
方法二:相减法
- 两数中最大的那个数减去最小的那个数,得到了一个值
- 然后让得到的这个值去替换两个数中大的那个
- 然后比较替换后的两个数,重复第一个步骤
- 当两个数相等的时候即为最大公因数
- 最后将刚开始的两个数相乘再除以最大公因数,之后得到的那个数就是最小公倍数
方法三:辗转相除法
- 判断两个数的最大值,让最大值除去最小值然后得到它的余数1
- 用两个数中的最小值除以余数1,得到余数2
- 让余数1除以余数2得到余数3
- 重复上述步骤,当哪一个余数为零,那么它的除数就是最大公因数