알고리즘/기타
[C++] 최대 공약수, 최소 공배수
키베이루
2023. 5. 8. 23:34
1. 최대 공약수
int gcd(int a, int b)
{
int n;
while (b != 0) {
n = a % b;
a = b;
b = n;
}
return a;
}
2. 최소 공배수
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
ex)
https://www.acmicpc.net/problem/1735
1735번: 분수 합
첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.
www.acmicpc.net
#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#include<string>
#include<map>
using namespace std;
int gcd(int a, int b)
{
int n;
while (b != 0) {
n = a % b;
a = b;
b = n;
}
return a;
}
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
int lc = lcm(b, d);
int re = a * (lc / b) + c * (lc / d);
int rlc = lc;
int rre = re;
//! 최대공약수로 약분
rlc = lc/ gcd(re, lc);
rre = re / gcd(re, lc);
cout << rre << ' ' << rlc;
}