Week 1 (수학) - 문제 2609번 (최대공약수와 최소공배수)

2023. 6. 30. 01:05백준 문제와 소스 코드

문제:

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

입력:

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

 

출력:

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

 

예제 입력1:

예제 출력1:

코드:

#include<iostream>

using namespace std;

int main()
{
    int a, b;           //처음 받을 두 정수 선언
    cin >> a >> b;      //두 정수 입력 받기
    int temp,temp1,temp2;   //임의로 저장할 변수 선언
    int rst;

    temp1 = a;      //temp1에 a를 저장
    temp2 = b;      //temp2에 b를 저장
    if (a >= b)         //a가 b보다 크거나 같으면
    {
        while (b != 0)      //b가 0일 때까지
        {
            temp = b;       //b를 temp에 저장
            b = a % b;      //b에 나머지 저장
            a = temp;       //a에 temp(=b) 저장
        }
        rst = a;
    }
    
    else                   //a가 b보다 작을 경우 (반대로)
    {
        while (a != 0)     
        {
            temp = a;       
            a = b % a;
            b = temp;
        }
        rst = b;
    }

    cout << rst<<endl;              //rst(GCD) 출력
    rst = (temp1 / rst) * temp2;   //rst에 최소공배수를 구하는 식 활용
    cout << rst;                    //rst(LCM) 출력
    return 0;
}

설명:

최대공약수 (GCD)를 구하는 방법으로 유클리드 알고리즘을 사용하였다.

 

유클리드 알고리즘

임의의 두 자연수 a, b가 주어졌을때. 둘 중 큰 값이 a라고 가정해보겠다

a를 b로 나눈 나머지를 n 이라고 하면 (a%b = n) n이 0일때, b가 최대공약수(GCD)이다.

만약 n이 0이 아니라면, a에 b값을 다시 넣고 n를 b에 대입 한 후 다시 위에 step2부터 반복하면 된다.

 

이후 최소공배수(LCM)는, 각각의 수에서 최대공약수로 나온 수들을 곱하고, 다시 최대공약수를 1번 곱하면

최소공배수가 나온다.