본문 바로가기
C++/백준 코딩테스트 풀이 C++

C++ 2609 최대공약수 최소공배수

by jjiing 2022. 4. 13.

나름 나눗셈으로 열심히 풀어보았지만..

계속해서 틀려 결국 구글링을 했는데 세상사람들 나 빼고 다 유클리드 호제법으로 풀었더라

 

내 틀린풀이

#include <iostream>


using namespace std;
int main()
{
	int a, b;
	cin >> a;
	cin >> b;

	int small = 0;
	int big=0;
	if (a > b)
	{
		small = b;
		big = a;
	}
	else if (a < b)
	{
		small = a;
		big = b;
	}
	//최대공약수
	int max;
	for (int i = small; i > 0; i--)
	{
		if (a % i == 0 && b % i == 0)
		{
			max = i;
			break;
		}
	}
	//최소공배수
	int min;
	for (int i = big; i < 10000000000; i++)
	{
		if (i % a == 0 && i % b == 0)
		{
			min = i;
			break;
		}
	}
	cout << max << endl << min;


}

 

웬만한 숫자는 다 정답이 나오는데, 큰 숫자를 넣었을 때 최소공배수를 구하면서 제대로 계산이 안되는 듯 했다.

 

 

 

그래서

유클리드 호제법이란?

 

 

유클리드 호제법

두 수의 최대 공약수를 구하는 알고리즘으로

A와 B의 최대공약수를 (A,B)라고 하고 A/B의 나머지를 R이라고 했을 때,

(A,B)=(B,R)인 것으로

이 연산을 계속해서 반복했을 때

(111,72)=(72,39)=(39,33)=(33,6)=(6,3)=(3,0)=3 

마지막으로 나오는 B가 두 수의 최대공약수가 된다.

 

 

또한 최소공배수

최소공배수 = A*B/최대공약수 를 이용해 구할 수 있다.

 

 

 

그럼 이 원리를 이용하여 아래와 같이 구할 수 있는데, 

(이 코드보다 이 다음 코드가 더 깔끔합니다)

#include <iostream>
using namespace std;

int main()
{
	int a, b;
	cin >> a;
	cin >> b;
	int max, min; //최대공약수, 최소공배수
	
    int x = a;
	int y = b;
	while (y != 0)
	{
		int r = x % y;
		x = y;
		y = r;
		max = x;
	}
	
	min = a * b / max;
	cout << max << endl << min;

}

 

 

이렇게 해도 정답처리는 되나,

이를 더 깔끔하게 함수처리 해줄 수 있다.

 

#include <iostream>


using namespace std;

int gcd(int a, int b)				//최대공약수
{
	int temp;
	while (b != 0)
	{
		temp = a % b;
		a = b;
		b = temp;
	}
	return a;
}
int lcm(int a, int b, int max)		//최소공배수
{
	return a * b / max;
}
int main()
{
	int a, b;
	cin >> a;
	cin >> b;

	cout << gcd(a, b) << endl << lcm(a, b, gcd(a, b)) << endl;

}

'C++ > 백준 코딩테스트 풀이 C++' 카테고리의 다른 글

C++ 2577 숫자의 개수  (0) 2022.06.20
c++ 1152 단어의 개수  (0) 2022.06.15
C++ 백준 10950번 A+B-3  (0) 2022.04.13
C++ 백준 2562번 최댓값  (0) 2022.04.13
C++ 백준 1008번 A/B  (0) 2022.04.12