最大公约数
定义
(来自百度百科)
暴力迭代法
步骤
假设两个数字a和b,比较出更小的数字赋值给变量min
,遍历1
到min
的整数,找到所有能共同被a和b整除的数字,其中数值最大的便是所求最大公约数。
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int min = a < b ? a : b; //三木操作符找出两个中较小的一个
int count = 0;
for (int i = 1; i <= min; i++) {
if (a % i == 0 && b % i == 0) { //如果 i 是两个数的约数
count = i; //记录下来
}
}
System.out.println(count);
}
}
缺点:时间复杂度太高了,只适合一些数值较小的数据
辗转相除法
步骤
假设两个数字a和b,求两个数字相除的余数 m = a % b,如果 b 为0
,则a 为最大公约数。如果b不为零,继续循环计算。
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
while (b!=0){
int m=a%b;
a=b;
b=m;
}
System.out.println(a);
}
}
更相减损法
步骤
以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到它们两个数相等为止。则相等的两个数就是所求的最大公约数。
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
while (a != b) //直到两个数相等
{
if (a > b) {
a = a - b;
} else {
b = b - a;
}
}
System.out.println(a);
}
}
最小公倍数
定义
(来自百度百科)
辗转相除法
步骤
因为两个数的乘积等于它们的最大公约数和最小公倍数的乘积。
所以可以先求出它们的最大公约数,然后用两个数的乘积除以最大公约数
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int num=a*b; //记录两个数的乘积
while (b!=0){
int m=a%b;
a=b;
b=m;
}
System.out.println(num/a); //其中 a 是两个数的最大公约数
}
}
暴力迭代法和更相减损法都是一样的思路,将不演示了
总结
要找出两个数的最大公约数和最小公倍数时,优先考虑辗转相除法和更相减损法,这两种方法的效率要更高,不容易超时运算。