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;
}
처음엔 두 분수의 최대공약수를 구해서 합하는 방식으로 풀었는데 바로 틀렸습니다! 였다. 이렇게 하면 서로소인 수의 경우에도 따로 케이스를 분류해주어야 한다. 그냥 우선 각 분모를 곱해 통분한 후 합한 결과를 기약분수 형태로 나타내는 것이 훨씬 간단했다.
유클리드 알고리즘에 대한 내용은 아래 글에서 확인하실 수 있습니다.
728x90
반응형
'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 |