두 분수를 통분 후 기약분수로 나타내야 하는 문제입니다.
통분은 분모를 동일하게 만들어야 하므로 최소공배수를 통해 분모를 구할 수 있습니다.
각 분수의 분자는 최소공배수에서 기존 분모로 나누면 각 분수에 곱해야 하는 값이 나옵니다.
각 분수에 해당 값을 곱하고 더해주면 분자도 구할 수 있습니다.
#include<iostream>
int get_gcd(const int a, const int b);
int get_lcm(const int a, const int b, const int gcd);
int main()
{
std::cin.tie(NULL);
std::ios_base::sync_with_stdio(false);
int a, b, c, d, gcd, lcm;
std::cin >> a >> b >> c >> d;
gcd = get_gcd(b, d);
lcm = get_lcm(b, d, gcd);
int a_multnum = lcm / b;
int c_multnum = lcm / d;
int numerator = a * a_multnum + c * c_multnum;
gcd = get_gcd(numerator, lcm);
while (gcd != 1)
{
numerator /= gcd;
lcm /= gcd;
gcd = get_gcd(numerator, lcm);
}
std::cout << numerator << " " << lcm;
return 0;
}
int get_gcd(const int a, const int b)
{
int copy_a;
int copy_b;
if (a < b)
{
copy_a = b;
copy_b = a;
}
else
{
copy_a = a;
copy_b = b;
}
int r;
while (copy_b != 0)
{
r = copy_a % copy_b;
copy_a = copy_b;
copy_b = r;
}
return copy_a;
}
int get_lcm(const int a, const int b, const int gcd)
{
return a * b / gcd;
}
이외에도 그냥 서로의 분모를 곱해주고 약분하는 방법도 있습니다.
int main()
{
std::cin.tie(NULL);
std::ios_base::sync_with_stdio(false);
int a, b, c, d;
std::cin >> a >> b >> c >> d;
int numerator = a * d + c * b;
int denominator = b * d;
int gcd = get_gcd(numerator, denominator);
while (gcd != 1)
{
numerator /= gcd;
denominator /= gcd;
gcd = get_gcd(numerator, denominator);
}
std::cout << numerator << " " << denominator;
return 0;
}