먼저 최대 공약수 gcd는 재귀로도 구현할 수 있고, 아래와 같이 반목문으로 구현할 수도 있다.
어느쪽이 큰 수인지 지정해줘야 한다.
이후에 큰수를 작은수로 나누고, 나눈 수를 다음에 나눠질 수로 정한다. 나머지는 다음에 나눌 수가 된다.
0으로 나눌 수는 없기 때문에 루프를 빠져 나간다고 외워도 좋고, 나머지가 0이 되었다는 것은 약수를 찾았다는 뜻이니까 루프를 빠져 나간다고 기억해도 좋겠다.
( ll은 long long 타입을 의미한다)
int gcd(ll a, ll b) {
if (a < b) swap(a, b); //a를 큰수로
while (b != 0) {
ll r = a % b;
a = b;
b = r;
}
return a;
}
다음으로, gcd를 활용해서 최소 공배수 lcm을 구하는 과정도 간단하게 구현할 수 있다.
ll lcm(ll a, ll b) {
return (a * b) / gcd(a, b);
}
최소 공배수의 정의대로, 두 수의 곱을 최대 공약수로 나눠주면 된다.
이를 활용해서, 여러개의 숫자의 최소 공배수를 구하는 과정을 보자.
ll finY = Y[0];
for (int i = 1; i < Y.size(); i++)
finY = lcm(finY, Y[i]);
finY에 벡터 Y의 원소들의 최소 공배수가 들어가게 된다. 먼저 벡터 Y의 0번째 값으로 finY를 초기화 한다.
그리고 다음 원소와 lcm을 구해서 저장하고, 또 저장한 lcm과 다음 원소의 lcm을 구하는 과정을 반복해주면 된다.
'Computer Science > Algorithm Theory' 카테고리의 다른 글
선택 정렬 알고리즘 구현 (C++) (0) | 2019.08.28 |
---|---|
Counting Sort (C++) (0) | 2019.08.23 |
기하 및 그래프 알고리즘 간단 정리 (0) | 2019.08.17 |
선분 교차 판별 (0) | 2019.08.11 |
CCW (0) | 2019.08.10 |