백준 c++/(1-1)백준 c++ 알고리즘 기초

백준 2609 c++ 최대공약수와 최소공배수

현구구 2022. 8. 19. 15:14

https://www.acmicpc.net/problem/2609

 

2609번: 최대공약수와 최소공배수

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

www.acmicpc.net


문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.


#include<iostream>

using namespace std;

int main()
{
	long long A, B; //입력받을 두 수
	cin >> A >> B;
	int arr_a[10000] = {0,};
	int arr_b[10000] = {0,};
	long long min_answer =1; //최소공배수 선언
	long long max_answer =1; //최대공약수 선언
	for (int i = 2; i < 10000; i++)
	{
		if ((A % i) == 0) //2로 나뉘어진다면
		{
			while (A % i == 0)//2로 그만나누어질때까지 나누고
			{
				A = A / i;
				arr_a[i]++;// arr_a[2] == 2의 개수 증가시킴
			}
		}
		if ((B % i) == 0) //B도 똑같이
		{
			while (B % i == 0)
			{
				B = B / i;
				arr_b[i]++;
			}
		}
	}
	for (int i = 0; i < 10000; i++)
	{
		int min_count;
		if (arr_a[i] <= arr_b[i])
			min_count = arr_a[i];
		if(arr_a[i] > arr_b[i])
			min_count = arr_b[i];
		if ((arr_a[i]) > 0 && (arr_b[i] > 0)) // 만약 arr_a[2]가 3 이라는건 2로 3번 나뉘어진다는거
		{
			while (min_count--)
			{
				min_answer *= i; //최소공배수에 i를 곱한다
			}
		}
		else
			continue;
	}
	for (int i = 0; i < 10000; i++)
	{
		int x = 1;
		if ((arr_a[i]) > 0 || (arr_b[i] > 0))
		{
			int big; // 많은거 개수
			if (arr_a[i] >= arr_b[i])
			{
				big = arr_a[i];
			}
			else
			{
				big = arr_b[i];
			}
			while(big--)
			{
				x *= i;
			}
			max_answer *= x;
		}
	}
	cout << min_answer << endl;
	cout << max_answer << endl;
}