Skip to content

Instantly share code, notes, and snippets.

@abankowski
Created August 31, 2014 16:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abankowski/976117a254f49e039366 to your computer and use it in GitHub Desktop.
Save abankowski/976117a254f49e039366 to your computer and use it in GitHub Desktop.
import scala.annotation.tailrec
case class VulgarFraction(counter: Int, denominator: Int) {
def toFloat = counter.toFloat / denominator
def toInt = counter / denominator
override def toString() = counter + "/" + denominator
@tailrec
private def gcd(a: Int, b: Int): Int = b match {
case 0 => a
case _ => gcd(b, (a % b))
}
private def simplify = gcd(counter, denominator) match {
case d if d > 1 => VulgarFraction(counter / d, denominator / d)
case _ => this
}
def +(that: VulgarFraction) =
VulgarFraction(counter * that.denominator + that.counter * this.denominator, denominator * that.denominator)
.simplify
def -(that: VulgarFraction) =
VulgarFraction(counter * that.denominator - that.counter * this.denominator, denominator * that.denominator)
.simplify
def *(that: VulgarFraction) =
VulgarFraction(counter * that.counter, this.denominator * that.denominator)
.simplify
def /(that: VulgarFraction) =
VulgarFraction(counter * that.denominator, this.denominator * that.counter)
.simplify
}
object VulgarFraction {
implicit def valueOf(in: Int) = VulgarFraction(in, 1)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment