[백준 5347] LCM (C#, C++) - soo:bak
작성일 :
문제 링크
설명
여러 쌍의 정수가 주어졌을 때, 각 쌍의 최소공배수(LCM)를 구하는 문제입니다.
- 입력으로 두 정수
a
,b
가 주어지고, 각각의 쌍에 대해LCM(a, b)
값을 구해야 합니다. - 단, 정수의 범위가 크기 때문에 오버플로를 주의하여, 적절한 크기의 자료형을 사용해야 합니다.
- 문제의 핵심은 최대공약수(GCD)를 이용하여 최소공배수(LCM)를 빠르게 계산하는 것입니다.
GCD와 LCM의 관계
- 최대공약수(Greatest Common Divisor, GCD)는 두 수가 공통으로 가지는 가장 큰 약수입니다.
- 최소공배수(Least Common Multiple, LCM)는 두 수의 공통 배수 중 가장 작은 값입니다.
- 두 수
a
,b
에 대해 다음과 같은 관계가 있습니다:
[ \text{LCM}(a, b) = \frac{a \times b}{\text{GCD}(a, b)} ]
GCD
는유클리드 호제법
을 사용하여 빠르게 구할 수 있습니다:
[ \text{GCD}(a, b) = \text{GCD}(b, a \bmod b) ]
접근법
- 테스트케이스 수를 입력받고, 각 쌍의 두 정수
a
,b
를 입력받습니다. - 유클리드 호제법으로
GCD
를 계산하고, 위 공식을 통해LCM
을 출력합니다.
Code
[ C# ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
class Program {
static long Gcd(long a, long b) {
return b == 0 ? a : Gcd(b, a % b);
}
static void Main() {
int t = int.Parse(Console.ReadLine());
while (t-- > 0) {
var input = Console.ReadLine().Split();
long a = long.Parse(input[0]);
long b = long.Parse(input[1]);
long lcm = a * b / Gcd(a, b);
Console.WriteLine(lcm);
}
}
}
[ C++ ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll getGcd(ll a, ll b) {
if (b == 0) return a;
return getGcd(b, a % b);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int cntCases; cin >> cntCases;
while (cntCases--) {
ll a, b; cin >> a >> b;
ll lcm = a * b / getGcd(a, b);
cout << lcm << "\n";
}
return 0;
}