유리수는 두 정수 a와 b의 몫으로 정의해요. 여기서 a는 분자, b는 분모라고 하고, b != 0이에요.
수학적으로 분모는 0이 될 수 없다는 점에 유의해요. 하지만 많은 유리수 구현에서는 분모가 0이 되는 것을 허용하고, 부동소수점 수의 양의 무한대나 음의 무한대와 비슷하게 동작해요. 그런 경우에도 일반적으로 분모와 분자가 동시에 0이 될 수는 없어요.
유리수 r = a/b의 절댓값 |r|은 |a|/|b|와 같아요.
두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 합은 r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂)와 같아요.
두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 차는 r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂)와 같아요.
두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 곱(곱셈)은 r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂)와 같아요.
a₂가 0이 아니라면, 유리수 r₁ = a₁/b₁을 다른 유리수 r₂ = a₂/b₂로 나눈 값은 r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁)이에요.
유리수 r = a/b의 음이 아닌 정수 n제곱은 r^n = (a^n)/(b^n)이에요.
유리수 r = a/b의 음의 정수 n제곱은 r^n = (b^m)/(a^m)이에요. 여기서 m = |n|이에요.
유리수 r = a/b의 실수(부동소수점) x제곱은 몫 (a^x)/(b^x)이고, 이는 실수예요.
실수 x의 유리수 r = a/b제곱은 x^(a/b) = root(x^a, b)예요. 여기서 root(p, q)는 p의 q제곱근이에요.
다음 연산을 구현해요:
유리수 구현은 항상 기약분수로 약분되어 있어야 해요.
예를 들어, 4/4는 1/1로, 30/60은 1/2로, 12/8은 3/2로 약분되어야 해요.
유리수 r = a/b를 약분하려면, a와 b를 a와 b의 최대공약수(gcd)로 나눠요.
예를 들어, gcd(12, 8) = 4이므로 r = 12/8은 (12/4)/(8/4) = 3/2로 약분할 수 있어요.
약분된 유리수는 "표준형"이어야 해요 (분모는 항상 양의 정수여야 해요).
분모가 음의 정수인 경우에는, 분자와 분모에 모두 -1을 곱해서 표준형이 되도록 해요.
예를 들어, 3/-4는 -3/4로 약분되어야 해요.
사용하는 프로그래밍 언어에는 유리수 구현이 없다고 가정해요.
더 어려운 도전을 즐기고 싶은 학습자는 rational-numbers.jl에서 한 줄의 주석을 해제해 보너스 테스트를 켤 수 있어요.
보너스 테스트에는 Julia와 그 타입 시스템에 대한 훨씬 더 높은 수준의 지식이 필요해요.
runtests.jl 파일에는 도움이 될 만한 링크가 몇 개 들어 있어요.
rational-numbers.jl 파일에는 보너스 테스트를 위한 추가 안내가 일부러 들어 있지 않아요. 임포트, 타입 정의, 추가 함수에 대해 신중하게 생각해 봐요.
Exercism에 가입하고 Julia 트랙을 개념 35개연습 문제 128개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.