반응형
https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
코드
#include <iostream>
using namespace std;
int divisor (int x, int y) { // 최대공약수
int z = x % y;
while (z != 0) {
x = y;
y = z;
z = x % y;
}
return y;
}
int multiple(int x, int y) { // 최소공배수
return (x * y) / divisor(x, y);
}
int main() {
int a, b, div, mul; // div 최대공약수 mul 최소공배수
cin >> a >> b;
div = divisor(a, b);
mul = multiple(a, b);
cout << div << "\n" << mul;
return 0;
}
풀이
두 자연수를 입력받아 최대공약수와 최소공배수를 구하는 문제이다.
최대공약수를 구할 때는 '유클리드 호제법'을 사용하면 쉽게 구할 수 있다.
- 유클리드 호제법
- a % b = c의 계산을 한다.
- c가 0이 아니라면 b와 c를 다시 나머지 연산을 한다.
- 위 식을 나머지 연산의 값이 0이 될 때까지 반복한다.
- 나머지 연산의 값이 0이 되었을 때 나누는 수의 값이 두 수의 최대공약수이다.
최대공약수를 구했다면 최소공배수는 간단한 식을 통해 구할 수 있다.
- 최소공배수
- 두 수의 곱 = 최대공약수 * 최소공배수이다.
- 유클리드 호제법을 통해 구한 최대공약수를 통해 최소공배수를 알 수 있다.
- 따라서 최소공배수 = (두 수의 곱) / 최대공약수이다.
위 두 공식을 함수로 각각 작성하였다.
최대공약수는 divisor 함수를 새로 만들어 유클리드 호제법을 통해 구한다.
최소공배수는 multiple 함수를 새로 만드는데 그 안에서 divisor 함수를 사용해 구한다.
두 함수를 통해 구한 최대공약수와 최소공배수를 출력한다.
반응형
'문제 해결 > BaekJoon' 카테고리의 다른 글
[백준] [C++] 2748번 피보나치 수 2 (0) | 2022.11.24 |
---|---|
[백준] [C++] 2747번 피보나치 수 (0) | 2022.11.24 |
[백준] [C++] 2441번 별 찍기 - 4 (0) | 2022.11.22 |
[백준] [C++] 2440번 별 찍기 -3 (0) | 2022.11.22 |
[백준] [C++] 2439번 별 찍기 - 2 (0) | 2022.11.21 |