C++ 문제풀이/백준 문제풀이

[백준 문제풀이 / 정수론 및 조합론] 2609. 최대공약수와 최소공배수

지노링 2022. 8. 22. 17:46
728x90

문제 내용

두 수를 입력받아 최대공약수와 최소공배수를 찾는 문제

 

풀이

최대공약수와 최소공배수에 대한 공식을 이용해 풀었...?

두 수를 각 각  a,b, 최대공약수를 G, 최소공배수를 L 이라 칭했을 때 아래와 같은 성질이 있다.

 

1. a × b = G × L 

두 수의 곱은 최대공약수와 최소공배수의 곱과 같다.

2. L =  ( a × b ) ÷ G 

즉 최소 공배수는 두 수의 곱에서 최대 공약수를 나눈 것 과 같다.

 

#include <iostream>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int a, b;

	cin >> a >> b;

	int G, L;

	int num = 1;
	int smaller = min(a, b);
	while (1)
	{
		if (num > smaller)
			break;

		if (a % num == 0 && b % num == 0)
			G = num;

		num++;
	}



	int la, lb;
	la = a / G;
	lb = b / G;

	L = la * lb * G;

	cout << G << "\n" << L;


}

 

시간은 작게 나왔지만 최대공약수를 구하는데 있어서 불필요한 반복을 많이 한다.

 

#include <iostream>

using namespace std;

int main()
{
	int n,m;
	cin >> n >>m;

	int a = n;
	int b = m;

	if(m > n)
	{
		a = m;
		b = n;
	}
	int temp = 0;

	while(b > 0)
	{
		temp = a % b;
		a = b;
		b = temp;
	}

	cout << a << endl;
	cout << n * m / a << endl;
	return 0;
}

 

와 같이 나머지 연산을 이용하면 더 쉽게 구할 수 있다.

728x90