最小公倍数公式
- 最小公倍数 = a*b/最大公约数
- l c m ( a , b ) = ( ∣ a × b ∣ g c d ( a , b ) ) lcm(a,b) = \left(\frac{|a \times b|}{gcd(a,b)}\right) lcm(a,b)=(gcd(a,b)∣a×b∣)
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
用较大数除以较小数,再用出现的余数去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后为0,则除数为最大公约数。
计算a = 30和b = 18的最大公约数的过程如下:
30/18 = 1 ······ 12
18/12 = 1 ······ 6
12/6 = 2 ······ 0
此时,余数是0,所以30和18的最大公约数是6。
- 递归写法
package test01;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
// 最小公倍数 = a*b/最大公约数
System.out.println(a*b/gcd(a,b));
}
/**
* 求最大公约数
* @param a 数a
* @param b 数b
* @return 结果
*/
private static int gcd(int a, int b) {
// 递归出口
if (b == 0) return a;
// 余数与除数反复相除
return gcd(b, a % b);
}
}
- 普通写法
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = br.readLine()) != null) {
String[] strArr = str.split(" ");
int n = Integer.parseInt(strArr[0]);
int m = Integer.parseInt(strArr[1]);
int numerator = m * n;
// 保证 m > n
if (n > m) {
int temp = m;
m = n;
n = temp;
}
// 最大公约数
while (n != 0) {
int temp = m % n;
m = n;
n = temp;
}
// 最小公倍数 = a*b/最大公约数
System.out.println(numerator/m);
}
}
}