Boj

[Boj] 백준 C++ #1735 분수 합

ima9ine4 2023. 12. 22. 21:57
728x90

문제

분수 A/B는 분자가 A, 분모가 B인 분수를 의미한다. A와 B는 모두 자연수라고 하자.

두 분수의 합 또한 분수로 표현할 수 있다. 두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구하는 프로그램을 작성하시오. 기약분수란 더 이상 약분되지 않는 분수를 의미한다.

입력

첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.

출력

첫째 줄에 구하고자 하는 기약분수의 분자와 분모를 뜻하는 두 개의 자연수를 빈 칸을 사이에 두고 순서대로 출력한다.


#include <iostream>
using namespace std;
int gcd(int x, int y){ // 유클리드 알고리즘
    if(x<y){
        int tmp = x;
        x = y; y = tmp;
    }
    int r = x%y;
    if(r==0){
        return y;
    }else{
        return gcd(y,r);
    }
}
int main() {
    int a,b,c,d,mom,son; cin>>a>>b>>c>>d;
    son = a*d + b*c; mom = b*d; //통분하여 합을 구함
    int res = gcd(son,mom); // 분자와 분모의 최대공약수를 구함
    son /= res; mom /= res; // 기약분수 형태로 나타내기 위해 최대공약수로 나눠줌
    cout << son << " " << mom <<endl;
    return 0;
}

처음엔 두 분수의 최대공약수를 구해서 합하는 방식으로 풀었는데 바로 틀렸습니다! 였다. 이렇게 하면 서로소인 수의 경우에도 따로 케이스를 분류해주어야 한다. 그냥 우선 각 분모를 곱해 통분한 후 합한 결과를 기약분수 형태로 나타내는 것이 훨씬 간단했다.


유클리드 알고리즘에 대한 내용은 아래 글에서 확인하실 수 있습니다.

 

[알고리즘] 유클리드 알고리즘(유클리드 호제법)

이산수학 보강 수업에서 유클리드 알고리즘에 대해 배웠다. 1학년 때부터 계속 배웠던건데 이번으로 3번째 정도 들으니까 좀 알겠더라.. 유클리드 알고리즘(유클리드 호제법)이란 2개의 자연수

ima9ine.tistory.com

 

 

1735번: 분수 합

첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.

www.acmicpc.net

 

반응형
LIST

'Boj' 카테고리의 다른 글

[Boj] 백준 C++ #2981 검문  (0) 2024.01.10
[Boj] 백준 C++ #1991 트리 순회  (0) 2024.01.05
[Boj] 백준 C++ #13241 최소공배수  (1) 2023.12.28
[Boj] 백준 C++ #3036 링  (1) 2023.12.23
[Boj] 백준 C++ #9613 GCD합  (2) 2023.12.22