언어/C++

[백준 1934 / C++] 최소공배수

연나연 2023. 12. 5. 11:31

해당 문제에서는 

1. 최대공약수 구하기 - 유클리드 호제법
2. 최대공약수를 이용해서 최소공배수 구하기 - 수가 2개일 경우.

가 필요하다.
유클리드 호제법 -  최대공약수 구하기
(유클리드 호제법 같은 공식은 외워두는 게 유용할 것 같기에 따로 정리하기로 하였다.)

정수(a,b)가 있고 a,b의 최소공배수를 구할 때,
a = b * ? ...c
b = c * ? ...d
c = d * ? ...e

이런식으로 반복되고 나머지가 0이 되면 그걸 나눈 값이 최대공약수가 된다.

EX1)
(6,2)
6 = 2 * 3 ...0        -> 나머지가 0이기에 2가 최대공약수이다.

EX2)
(17,13)
17 = 13 * 1 ...4
13 = 4 * 3 ...1
4 = 1 * 4 ...0         -> 나머지가 0 이기에 1이 최대공약수이다.
최대공약수를 이용해서 최소공배수를 구하는 법
이건 수가 몇 개인지에 따라 다르다.
즉 2개의 수의 최소공배수를 구하느냐, 3개 수의 최소공배수를 구하느냐에 따라 다름.

2개 수일 경우)
두 자연수의 곱 = 최소공배수 * 최대공약수 
최소공배수 = 최대공약수/두 자연수의 곱
#include <iostream>
using namespace std;

int gcd(int a, int b) {
	int c;
	while (b != 0) {
		c = a % b;
		a = b;
		b = c;
	}
	return a;
}

int main() {
	int T; //테스트 케이스의 개수
	int A, B; //입력받을 자연수 A,B
	int least_common_multiple; //자연수 A,B의 최소공배수
	//int greatest_common_divisor; //자연수 A,B의 최대공약수
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> A >>  B;

		int max = (A < B) ? B : A;
		int min = (A < B) ? A : B;

		int greatest_common_divisor = gcd(max, min);
		least_common_multiple = (A * B) / greatest_common_divisor;

		cout << least_common_multiple << endl;
	}


	return 0;
}