[백준 1735] 분수 합 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 분수를 더한 뒤, 기약분수 형태로 출력하는 수학적 구현 문제입니다.
- 입력으로 두 개의 분수가 주어집니다 (
a/b
,c/d
). - 두 분수를 더한 값을 기약분수(더 이상 약분할 수 없는 형태)로 출력해야 합니다.
- 기약분수로 만들기 위해서는 분자와 분모의 최대공약수(GCD)를 계산한 뒤 약분해야 합니다.
접근법
- 먼저 분수의 합을 계산하기 위해 통분을 수행합니다:
- 이후
분자
와분모
의 최대공약수(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;
}