解题思路

这是一个求最小公倍数的问题。最小公倍数可以通过两个数的乘积除以它们的最大公约数得到。

关键点

  1. 数据范围:
  2. 需要先求最大公约数(GCD)
  3. 最小公倍数 =

代码

#include <iostream>
using namespace std;

// 求最大公约数 - 使用辗转相除法
int getGCD(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 求最小公倍数
int getLCM(int a, int b) {
    int gcd = getGCD(a, b);
    return (long long)a * b / gcd;  // 注意防止溢出
}

int main() {
    int a, b;
    while (cin >> a >> b) {
        cout << getLCM(a, b) << endl;
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    // 求最大公约数 - 使用辗转相除法
    public static int getGCD(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
    
    // 求最小公倍数
    public static int getLCM(int a, int b) {
        int gcd = getGCD(a, b);
        return (int)((long)a * b / gcd);  // 注意防止溢出
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            System.out.println(getLCM(a, b));
        }
    }
}
def get_gcd(a, b):
    # 求最大公约数 - 使用辗转相除法
    while b:
        a, b = b, a % b
    return a

def get_lcm(a, b):
    # 求最小公倍数
    gcd = get_gcd(a, b)
    return a * b // gcd

while True:
    try:
        a, b = map(int, input().split())
        print(get_lcm(a, b))
    except:
        break

算法及复杂度

算法分析

  1. 辗转相除法求GCD:

    • 基于 的原理
    • 两数的最大公约数等于较小数和余数的最大公约数
  2. 最小公倍数计算:

    • 利用
    • 注意计算过程中的溢出问题

复杂度分析

  • 时间复杂度:
  • 空间复杂度: