백준 1735 - 분수 합

황재진·2024년 2월 26일

백준

목록 보기
5/54
post-thumbnail

두 분수를 통분 후 기약분수로 나타내야 하는 문제입니다.

통분은 분모를 동일하게 만들어야 하므로 최소공배수를 통해 분모를 구할 수 있습니다.

각 분수의 분자는 최소공배수에서 기존 분모로 나누면 각 분수에 곱해야 하는 값이 나옵니다.
각 분수에 해당 값을 곱하고 더해주면 분자도 구할 수 있습니다.

#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;
}
profile
프로그래밍, 쉐이더 등 이것저것 다해보는 게임 개발자입니다

0개의 댓글