작성일 :

문제 링크

1735번 - 분수 합

설명

두 분수를 더한 뒤, 기약분수 형태로 출력하는 수학적 구현 문제입니다.

  • 입력으로 두 개의 분수가 주어집니다 (a/b, c/d).
  • 두 분수를 더한 값을 기약분수(더 이상 약분할 수 없는 형태)로 출력해야 합니다.
  • 기약분수로 만들기 위해서는 분자와 분모의 최대공약수(GCD)를 계산한 뒤 약분해야 합니다.

참고 : GCD(최대공약수)와 유클리드 호제법의 원리 - soo:bak

참고 : 기약 분수(irreducible fraction)의 알고리듬적 접근 - soo:bak

접근법

  • 먼저 분수의 합을 계산하기 위해 통분을 수행합니다:
\[\frac{a}{b} + \frac{c}{d} = \frac{a \cdot d + c \cdot b}{b \cdot d}\]
  • 이후 분자분모의 최대공약수(GCD)를 계산해 각각 나누어 줍니다.
  • 출력은 기약분자의 값기약분모의 값을 공백으로 구분하여 출력합니다.

Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

class Program {
  static long Gcd(long a, long b) {
    return b == 0 ? a : Gcd(b, a % b);
  }

  static void Main() {
    var f1 = Array.ConvertAll(Console.ReadLine().Split(), long.Parse);
    var f2 = Array.ConvertAll(Console.ReadLine().Split(), long.Parse);

    long numerator = f1[0] * f2[1] + f2[0] * f1[1];
    long denominator = f1[1] * f2[1];
    long gcd = Gcd(numerator, denominator);

    Console.WriteLine($"{numerator / gcd} {denominator / gcd}");
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll getGcd(ll a, ll b) {
  if (b == 0) return a;
  return getGcd(b, a % b);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ll nmr1, dnm1; cin >> nmr1 >> dnm1;
  ll nmr2, dnm2; cin >> nmr2 >> dnm2;

  ll nmrA = nmr1 * dnm2 + nmr2 * dnm1;
  ll dnmA = dnm1 * dnm2;
  ll gcd = getGcd(nmrA, dnmA);

  cout << nmrA / gcd << " " << dnmA / gcd << "\n";

  return 0;
}