https://www.acmicpc.net/problem/1735
1735번: 분수 합
첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.
www.acmicpc.net
해결 방법
유클리드 호제법을 사용했다.
- 분모끼리 곱해서 우선 약분이 가능하거나 가능하지 않은 한 개의 분수로 만든다.
- 구해진 분자와 분모를 이용해 유클리드 호제법을 적용하면 최대공약수를 구할 수 있다.(당연히 1일 수 있다)
- 최대공약수로 분자와 분모를 나누어 주면 끝.
정말 간단했는데... 새삼 알고리즘 구상의 중요성을 느낀다. 턱을 괴고 생각하는 시간을 더 늘려야겠다.
#include <iostream>
#include <algorithm>
using namespace std;
long long int max_div;
long long int min_mul;
long long int A, AS, B, BS;
long long int euclid(long long int a, long long int b)
{
if (a % b != 0)
{
return euclid(b, a % b);
}
else
{
return b;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> AS >> A;
cin >> BS >> B;
long long int num;
long long int cnt = 0;
long long int max_div = euclid((A < B ? A : B), (A > B ? A : B));
long long int S, M;
S = AS * B + BS * A;
M = A * B;
if (S < M)
{
max_div = euclid(M, S);
}
else if (S > M)
{
max_div = euclid(S, M);
}
else
{
cout << "1 1";
return 0;
}
cout << S / max_div << ' ' << M / max_div;
return 0;
}
'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글
[C++/백준 4134번] 다음 소수 (0) | 2024.01.27 |
---|---|
[C++/백준 2485번] 가로수 (0) | 2023.08.25 |
[C++/ 백준 13241번] 최소공배수 (0) | 2023.08.17 |
[C++/백준 11478번] 서로 다른 부분 문자열의 개수 (0) | 2023.08.16 |
[C++/백준 1764번] 듣보잡 (0) | 2023.08.14 |