描述
对于给定的两个正整数 a,b,它们的最小公倍数 lcm(a,b) 是指能同时被 a 和 b 整除的最小正整数。
求解 lcm(a,b)。
求解 lcm(a,b)。
输入描述:
在一行上输入两个整数 a,b(1≦a,b≦105)。
输出描述:
输出一个整数,表示 lcm(a,b)。
解法一(java):
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int max = a > b ? a : b;
int p = a * b;
int result = p;
for (int i = max ; i <= p ; i++) {
if (i % a == 0 && i % b == 0) {
result = i;
break;
}
}
System.out.println(result);
}
}
思路:遍历,从两个数最大的那个数开始,然后一直遍历到两数相乘的结果,如果能满足条件就记录当前的值并退出循环,然后打印值即可。
解法二(java):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(lcm(a, b));
}
// 计算最大公约数 (GCD) 使用欧几里得算法
private static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
// 计算最小公倍数 (LCM)
private static int lcm(int a, int b) {
return (a / gcd(a, b)) * b; // 先除后乘避免可能的整数溢出
}
}
思路:
-
输入处理:使用
Scanner
读取两个整数a
和b
。 -
GCD 计算:
gcd
方法使用欧几里得算法递归地计算两个数的最大公约数。 -
LCM 计算:
lcm
方法利用 GCD 的结果,通过公式(a × b) / GCD(a, b)
计算最小公倍数。为了优化计算和避免整数溢出,先进行除法再进行乘法。 -
输出结果:打印计算得到的 LCM。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1