/* * file: rational.kt * author: SS * date: 2019-11-03 */ fun main() { val a = Rational(-6L, -2L) val b = Rational(4L, -16L) val sum = a + b val difference = a - b val product = a * b val quotient = a / b println("($a) + ($b) = $sum") println("($a) - ($b) = $difference") println("($a) * ($b) = $product") println("($a) / ($b) = $quotient") val bad = Rational(3L, 7L-7L) } class Rational(a: Long, b: Long) { val numer: Long val denom: Long init { if (b == 0L) { println("Can't create a rational with denominator 0. Bye.") kotlin.system.exitProcess(-1) } val d = gcd(a, b) var tobenumer = a / d var tobedenom = b / d if (tobedenom < 0L) { tobedenom = -tobedenom tobenumer = -tobenumer } numer = tobenumer denom = tobedenom } private fun gcd(aparam: Long, bparam: Long): Long { if (aparam < 0L && bparam >= 0L) return gcd(-aparam, bparam) else if (aparam >= 0L && bparam < 0L) return gcd(aparam, -bparam) else if (aparam < 0L && bparam < 0L) return gcd(-aparam, -bparam) var a = aparam var b = bparam while (b > 0L) { val r = a % b a = b b = r } return a } operator fun plus(o: Rational): Rational { val nu = numer * o.denom + o.numer * denom val de = denom * o.denom return Rational(nu, de) } operator fun minus(o: Rational): Rational { val nu = numer * o.denom - o.numer * denom val de = denom * o.denom return Rational(nu, de) } operator fun times(o: Rational): Rational { val nu = numer * o.numer val de = denom * o.denom return Rational(nu, de) } operator fun div(o: Rational): Rational { val nu = numer * o.denom val de = denom * o.numer return Rational(nu, de) } override fun toString(): String { return "$numer / $denom" } }