本篇文章展示语言为Java,主要运用暴力枚举和辗转相除法。
一、求最大公约数
1.暴力枚举法
主要思路:先找出两个数当中的最小值赋值给min,判断min是否可以被这两个数整除,如果条件失败就减减,直到找到为止。
public class demo2 {
//给定两个数,求这两个数的最大公约数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
//找出两个数的最小值
int min = (a > b ? b : a);
while (true){
if (a % min == 0 && b % min == 0 ) {
break;
}
min--;
}
System.out.println(min);
}
}
2、辗转相除法
其实也很简单,没有那么玄乎,但是没有特意学过的人并不容易想出来,大致思路如下:
将输入的两个数一个赋值给a,一个赋值给b,然后将a%b的结果赋值给另一个变量m。
之后呢,如果m不为0,就将b赋值给a,m赋值给b,再次计算m的值。
直到m为0,当m为0时,这时的b就为两者之间的最大公约数。
public class demo2 {
//给定两个数,求这两个数的最大公约数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int m = a % b;
while (m != 0 ) {
a = b;
b = m;
m = a % b;
}
System.out.println(b);
}
}
值得提醒的是:这里是没必要像暴力枚举那般,将a固定为大的值,b为小的值,其实你细心想想,这并不影响,举个栗子,a为18,b为24,当a%b时,m的结果为18,顺着程序的思路,m的赋值给b,b的值赋值给a....... 发现程序会自动帮我们校对。
二、求最小公倍数
1、暴力枚举法
同求最大公约数是一样的,通过暴力枚举的方式,取a和b中的最大值,之后再看这个最大值是否能整除于这两个数,不能的话就让max继续自增,如此反复,直到max满足条件。
public static void main(String[] args) {
//求最小公倍数
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int max = a > b ? a : b;
while(true) {
if (max % a == 0 && max % b == 0) {
break;
}
max++;
}
System.out.println(max);
}
2、巧用数学特性
主要思路:我们知道两个数的乘积除以他们的最大公约数等于最小公倍数。
因此可以先利用辗转相除法求出最大公约数后再进行计算。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
//先将最初的a和b保存一份
int x = a;
int y = b;
int m = a % b;5
while (m != 0 ) {
a = b;
b = m;
m = a % b;
}
//先利用辗转相除法求最大公约数
System.out.println(x*y/b);
}