유리수는 두 정수 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로 약분되어야 해요.
사용하는 프로그래밍 언어에는 유리수 구현이 없다고 가정해요.
numerator와 denominator 슬롯을 가진 rat 튜플을 정의해요.
<rat>은 인자를 기약 분수로 약분해야 하고, 부호는 분자에 붙어요(그래서 분모는 항상 양수예요).
<rat> ( numerator denominator -- rat ): 기약 분수를 만들어요.>rat ( pair -- rat ): { numerator denominator }로 rat을 만들어요.rat>pair ( rat -- pair ): { numerator denominator }를 반환해요.r+ ( a b -- c ), r- ( a b -- c ), r* ( a b -- c ),
r/ ( a b -- c ): 두 유리수의 사칙연산을 해요.r-abs ( a -- |a| ): 절댓값을 구해요.r^ ( a n -- a^n ): 유리수를 정수 거듭제곱으로 올려요
(음수 지수도 가능해요).real^r ( x a -- y ): 실수를 유리수 지수로 거듭제곱하고 부동소수점 값을 반환해요.Factor의 MATH: 제네릭(+, -, *, /)은 내장된 수학 계층에만
디스패치되기 때문에, 이 연습 문제에서는 그 제네릭의 메서드 대신
전용 단어 이름을 사용해요.
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.