45 lines
1.3 KiB
Scala
45 lines
1.3 KiB
Scala
class Rational(n: Long, d:Long) extends Ordered[Rational]
|
|
{
|
|
require(d!=0)
|
|
private val g:Long = gcd(n, d)
|
|
val numerator:Long = n/g
|
|
val denominator:Long = d/g
|
|
|
|
def this(n:Long)=this(n,1)
|
|
|
|
def +(that:Rational):Rational=new Rational(
|
|
numerator*that.denominator + that.numerator*denominator,
|
|
denominator*that.denominator)
|
|
|
|
def -(that:Rational):Rational=new Rational(
|
|
numerator*that.denominator - that.numerator*denominator,
|
|
denominator*that.denominator)
|
|
|
|
def *(that:Rational):Rational=
|
|
new Rational(numerator*that.numerator, denominator*that.denominator)
|
|
|
|
def /(that:Rational):Rational=
|
|
new Rational(numerator*that.denominator, that.numerator*denominator)
|
|
|
|
def unary_~ :Rational=new Rational(denominator, numerator)
|
|
|
|
def unary_- :Rational=new Rational(-numerator, denominator)
|
|
|
|
def abs :Rational=new Rational(Math.abs(numerator), Math.abs(denominator))
|
|
|
|
override def compare(that:Rational):Int=
|
|
(this.numerator*that.denominator-that.numerator*this.denominator).toInt
|
|
|
|
override def toString()=numerator+"/"+denominator
|
|
|
|
private def gcd(x:Long, y:Long):Long=
|
|
if(y==0) x else gcd(y, x%y)
|
|
}
|
|
|
|
object Rational
|
|
{
|
|
def apply(n: Long, d:Long)=new Rational(n,d)
|
|
def apply(n:Long)=new Rational(n)
|
|
implicit def longToRational(i:Long)=new Rational(i)
|
|
}
|