끄적끄적 코딩
article thumbnail
728x90

최대공약수와 최소공배수를 구하는 문제입니다.

소인수를 전부 구해서 배열에 넣습니다.
arr[x][y]에서 x는 소인수를 의미하고 y는 두개의 자연수를 의미합니다.

최대공약수

maxResult *= min(pow(i, arr[i][0]), pow(i, arr[i][1]));


최소공배수

minResult *= max(pow(i, arr[i][0]), pow(i, arr[i][1]));

 

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;

int main(int argc, char *argv[])
{
	int x, y;
	int bigNum;
	int maxResult = 1;
	int minResult = 1;
	int arr[10010][2];

	cin >> x;
	cin >> y;

	bigNum = max(x, y);
	memset(arr, 0, sizeof(arr));

	while (1) {
		if (x == 1 && y == 1) {
			break;
		}

		for (int i = 2; i < bigNum; ++i) {
			if (x != 1 && x % i == 0) {
				++arr[i][0];
				x /= i;
				break;
			}
			if (y != 1 && y % i == 0) {
				++arr[i][1];
				y /= i;
				break;
			}
		}
	}

	for (int i = 2; i < bigNum; ++i) {
		if (arr[i][0] != 0 && arr[i][1] != 0) {
			maxResult *= min(pow(i, arr[i][0]), pow(i, arr[i][1]));
		}
		if (arr[i][0] != 0 || arr[i][1] != 0) {
			minResult *= max(pow(i, arr[i][0]), pow(i, arr[i][1]));
		}
	}

	cout << maxResult << endl;
	cout << minResult << endl;

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 3036번 링  (0) 2019.09.03
[C++] 백준 2981번 검문  (0) 2019.09.03
[C++] 백준 11653번 소인수분해  (0) 2019.09.02
[C++] 백준 1037번 약수  (0) 2019.09.02
[C++] 백준 5086번 배수와 약수  (0) 2019.09.02

검색 태그