문제
https://www.acmicpc.net/problem/1735
1735번: 분수 합
첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.
www.acmicpc.net
설명
두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구해야 한다.
\( \dfrac{A}{B} + \dfrac{C}{D} = \dfrac{A \times D + B \times C}{B \times D} \)
분수의 합을 계산하는 방법은 다음과 같다. 여기서 기약분수로 만들어야 하므로 최종 결과에서 분자와 분모의 최대공약수를 구하고 분자와 분모를 각각 구한 값으로 나눠주면 된다.
int temp1 = A * D + B * C;
int temp2 = B * D;
int gcd = getGcd(temp1, temp2);
두 수의 최대공약수를 구할 때에는 유클리드 호제법을 사용하면 된다.
static int getGcd(int a, int b) {
if (a % b == 0)
return b;
else
return getGcd(b, a % b);
}
전체 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int A, B, C, D;
static int getGcd(int a, int b) {
if (a % b == 0)
return b;
else
return getGcd(b, a % b);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
C = Integer.parseInt(st.nextToken());
D = Integer.parseInt(st.nextToken());
int temp1 = A * D + B * C;
int temp2 = B * D;
int gcd = getGcd(temp1, temp2);
System.out.println(temp1 / gcd + " " + temp2 / gcd);
}
}
728x90
반응형
'알고리즘 > 정수론' 카테고리의 다른 글
[백준] 14476번 최대공약수 하나 빼기 (JAVA) (0) | 2023.03.05 |
---|---|
[백준] 1837번 암호제작 (JAVA) (0) | 2023.03.05 |
[CS] 유클리드 호제법 (JAVA) (0) | 2023.03.03 |
[백준] 1644번 소수의 연속합 (JAVA) (0) | 2023.03.03 |
[CS] 에라토스테네스의 체 (JAVA) (0) | 2023.03.02 |