최소공배수를 구하는 문제입니다.
중학교 때 배웠던 소인수분해를 기억하시나요?
만약 8과 16이라는 두 수가 주어졌을 때, 소인수분해를 통해 최대공약수와 최소공배수를 구할 수 있습니다.
아래의 표는 소인수분해의 과정을 나타낸 것입니다.
2 | 8 | 16 |
2 | 4 | 8 |
2 | 2 | 4 |
1 | 2 |
여기서 좌측의 노란색 배경 숫자들을 곱하면 최대공약수,
최대공약수에 초록 배경 숫자들까지 곱해주면 최소공배수를 구할 수 있습니다.
8과 16의 최대공약수는 2*2*2 = 8 이 되겠고,
최소공배수는 2*2*2*1*2 = 16 이 되겠죠.
소인수분해의 과정만 코드로 구현한다면, 이 문제를 해결할 수 있습니다.
최대공약수,최소공배수 구하는 함수)
int common(int a, int b)
{
int divisor = 1;
for (int i = 2; a >= i && b >= i;)
{
if (a % i == 0 && b % i == 0)
{
a /= i;
b /= i;
divisor *= i;
i = 2;
}
else
{
i++;
}
}
return divisor * a * b;
}
두 숫자 a와 b를 입력받아 소인수분해하는 함수입니다.
i가 2부터 1씩 커지며 공통 약수를 찾습니다.
공통 약수라면 a 와 b를 한번씩 나누어주고 다시 2부터 약수를 찾는 과정을 반복합니다.
언제까지? a와 b가 i 보다 작아질 때까지 반복합니다.
그리고 이 과정을 한 번 반복할 때마다 divisor 변수에 약수를 계속 곱해줍니다.
모든 과정이 끝나고 나면, divisor 변수에는 최대공약수가 남아있을 것이고, a와 b는 더이상 공통약수가 없는 숫자이겠죠.
그래서 divisor * a * b 를 해주면 최대공약수가 나오는 것입니다.
전체 코드)
#include <stdio.h>
int common(int a, int b);
int main(void)
{
int T;
scanf("%d", &T);
int a, b;
for (int i = 0; i < T; i++)
{
scanf("%d %d", &a, &b);
if (a == b)
{
printf("%d\n", a);
}
else
{
printf("%d\n", common(a, b));
}
}
return 0;
}
int common(int a, int b)
{
int divisor = 1;
for (int i = 2; a >= i && b >= i;)
{
if (a % i == 0 && b % i == 0)
{
a /= i;
b /= i;
divisor *= i;
i = 2;
}
else
{
i++;
}
}
return divisor * a * b;
}
a와 b가 같다면 소인수분해를 할 필요가 없으니 바로 출력하도록 하는 조건도 추가해주었습니다.!
'백준 > c' 카테고리의 다른 글
백준_10989_수정렬하기3(counting sort) (0) | 2024.05.03 |
---|---|
백준_2903_중앙이동알고리즘 (2) | 2024.05.03 |
백준_2751_수정렬하기2_(radixSort) (2) | 2024.05.01 |
백준_10845_큐(queue) (0) | 2024.05.01 |
백준_2775_부녀회장이될테야 (0) | 2024.04.28 |