题目:输入两个正整数m和n,求其最大公约数和最小公倍数
程序分析
- 需要求两个正整数m和n的最大公约数和最小公倍数。
- 最大公约数(GCD)是两个数的最大公因数,最小公倍数(LCM)是两个数的最小公倍数。
解题思路
我们可以使用三种不同的方法来实现这个程序,分别是:
- 辗转相除法:利用辗转相除法求解最大公约数,然后通过公式计算最小公倍数。
- 穷举法:从1到m*n中的每个数,逐个判断是否是最大公约数和最小公倍数。
- 公式法:利用最大公约数的公式计算最小公倍数。
方法一:辗转相除法
优点:
- 算法简单,容易理解和实现。
缺点:
- 求解最小公倍数需要额外计算,效率稍低。
public class GCD_LCM {
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
public static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
public static void main(String[] args) {
int m = 12;
int n = 18;
int gcdResult = gcd(m, n);
int lcmResult = lcm(m, n);
System.out.println("GCD: " + gcdResult);
System.out.println("LCM: " + lcmResult);
}
}
方法二:穷举法
优点:
- 算法简单,容易理解和实现。
缺点:
- 需要遍历多个数进行判断,效率较低。
public class GCD_LCM {
public static int gcd(int a, int b) {
int min = (a < b) ? a : b;
int gcdResult = 1;
for (int i = 1; i <= min; ++i) {
if (a % i == 0 && b % i == 0)
gcdResult = i;
}
return gcdResult;
}
public static int lcm(int a, int b) {
int max = (a > b) ? a : b;
int lcmResult = max;
while (1) {
if (lcmResult % a == 0 && lcmResult % b == 0)
break;
lcmResult += max;
}
return lcmResult;
}
public static void main(String[] args) {
int m = 12;
int n = 18;
int gcdResult = gcd(m, n);
int lcmResult = lcm(m, n);
System.out.println("GCD: " + gcdResult);
System.out.println("LCM: " + lcmResult);
}
}
方法三:公式法
优点:
- 直接使用公式计算最大公约数和最小公倍数,效率较高。
缺点:
- 需要理解和使用最大公约数和最小公倍数的公式。
public class GCD_LCM {
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
public static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
public static void main(String[] args) {
int m = 12;
int n = 18;
int gcdResult = gcd(m, n);
int lcmResult = (m * n) / gcdResult;
System.out.println("GCD: " + gcdResult);
System.out.println("LCM: " + lcmResult);
}
}
总结与推荐
- 在这个特定问题中,辗转相除法(方法一)和公式法(方法三)是效率较高的方法,避免了不必要的计算。
- 穷举法(方法二)虽然实现简单,但效率较低,特别是对于大数值,遍历范围过大。
- 推荐使用辗转相除法(方法一)或公式法(方法三),因为它们综合了实现简单和较高的效率。在这个特定问题中,这两种方法都能够得到正确的结果,但公式法更直接。