알고리즘/문제 풀이

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

Themion 2021. 12. 17. 17:16

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

 

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

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

www.acmicpc.net

두 수 a와 b(a > b)에 대해, 두 수가 최대공약수 n을 가지고 있다고 하자.

두 수가 같은 약수를 가지고 있으므로 a와 b는 각각 서로소 p와 q에 대해 pn과 qn으로 나타낼 수 있는데, a % b = pn % qn = (p % q)n이므로 pn과 qn의 최대공약수는 qn과 (p % q)n의 최대공약수이다.

이 과정을 p와 q 둘 중 하나가 0이 될 때까지 진행하면 나머지 하나가 1이 되므로, 즉 a와 b가 n과 0이 되므로 최대공약수 n을 반환해 최대공약수를 구할 수 있다.

최소공배수는 a * b / n이므로 n과 a * b / n을 차례로 출력한다

#include <cstdio>

// 유클리드 호제법을 이용해 a와 b의 최대공약수를 계산
int gcd(int a, int b) {
    if (!b) return a;
    return ((a > b) ? gcd(b, a % b) : gcd(a, b % a));
}

int main() {
    // a, b: 입력받을 두 수, c: a와 b의 최대공약수
    int a, b, c;

    // a와 b를 입력받은 뒤 최대공약수를 c에 저장
    scanf("%d %d", &a, &b);
    c = gcd(a, b);
    // 최소공배수는 두 수의 곱에 최대공약수를 나눈 값이므로
    // 최대공약수 c와 최소공배수 a * b / c를 출력
    printf("%d\n%d\n", c, a * b / c);

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

2638번: 치즈  (0) 2021.12.17
2630번: 색종이 만들기  (0) 2021.12.17
2606번: 바이러스  (0) 2021.12.17
2588번: 곱셈  (0) 2021.12.17
2581번: 소수  (0) 2021.12.17