PuzzleHead
PuzzleHead

Reputation: 3

How to multiply and sumup fractions in kotlin

i'm new to kotlin and i'm having a trouble multiplying same parameters of two objects which are in the same class.

  class Fraction (private val numerator:Int, denumerator:Int)

i have a class called fraction and 2 objects.

    var f1 = Fraction(1,6)
    var f2 = Fraction(3,6)

i want to create a function which multiplies first fraction on the second fraction. also i have to create a function which adds up these two fractions.

can someone help me?

Upvotes: 0

Views: 446

Answers (2)

Arpit Shukla
Arpit Shukla

Reputation: 10493

You can use operator overloading here to support plus and times operation.

data class Fraction(val numerator: Int, val denominator: Int) {
    operator fun plus(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.denominator + this.denominator * other.numerator,
            denominator = this.denominator * other.denominator
        )
    }

    operator fun times(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.numerator,
            denominator = this.denominator * other.denominator
        )
    }
}

Usage:

val f1 = Fraction(1, 2)
val f2 = Fraction(3, 5)
println(f1 + f2)
println(f1 * f2)

Output:

Fraction(numerator=11, denominator=10)
Fraction(numerator=3, denominator=10)

Note that the resultant fraction won't be a reduced one. If you want the fraction in its lowest terms, you will have to divide numerator and denominator by their gcd. The final code will be:

data class Fraction(val numerator: Int, val denominator: Int) {
    operator fun plus(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.denominator + this.denominator * other.numerator,
            denominator = this.denominator * other.denominator
        ).reduced()
    }

    operator fun times(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.numerator,
            denominator = this.denominator * other.denominator
        ).reduced()
    }

    fun reduced(): Fraction {
        val gcd = gcd(numerator, denominator)
        return Fraction(numerator / gcd, denominator / gcd)
    }
}

tailrec fun gcd(n1: Int, n2: Int): Int {
    return if (n2 != 0) gcd(n2, n1 % n2) else n1
}

Edit: As per @gidds suggestion in comments, I have added few more utility functions in the class which will help you when dealing with fractions.

data class Fraction(val numerator: Int, val denominator: Int) : Comparable<Fraction> {

    operator fun plus(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.denominator + this.denominator * other.numerator,
            denominator = this.denominator * other.denominator
        ).reduced()
    }

    operator fun minus(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.denominator - this.denominator * other.numerator,
            denominator = this.denominator * other.denominator
        ).reduced()
    }

    operator fun times(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.numerator,
            denominator = this.denominator * other.denominator
        ).reduced()
    }

    operator fun div(other: Fraction): Fraction {
        return Fraction(
            numerator = this.numerator * other.denominator,
            denominator = this.denominator * other.numerator
        ).reduced()
    }

    override fun equals(other: Any?): Boolean {
        if (other == null) return false
        if (other !is Fraction) return false
        return this.numerator * other.denominator == this.denominator * other.numerator
    }

    override fun hashCode(): Int {
        return with(reduced()) { 31 * numerator + denominator }
    }

    override operator fun compareTo(other: Fraction): Int {
        return when {
            this == other -> 0
            this.numerator * other.denominator > this.denominator * other.numerator -> 1
            else -> -1
        }
    }

    override fun toString(): String {
        return "$numerator/$denominator"
    }

    fun reduced(): Fraction {
        val gcd = gcd(numerator, denominator)
        return Fraction(numerator / gcd, denominator / gcd)
    }
}

Upvotes: 2

Jorge Luiz
Jorge Luiz

Reputation: 286

// Use data class instead class because the purpose of class is only hold data
data class Fraction(var numerator: Int, var denumerator: Int)

fun multiplyFraction(f1: Fraction, f2: Fraction) : Fraction {
    val fractionResult = Fraction(
        (f1.numerator * f2.numerator),
        (f1.denumerator * f2.denumerator)
    )
    return fractionResult
}

fun addUpFraction(f1: Fraction, f2: Fraction) : Fraction {
    lateinit var fractionResult: Fraction
    // If f1 e f2 denumerators are equal
    if (f1.denumerator === f2.denumerator) {
        fractionResult = Fraction(
            (f1.numerator + f2.numerator),
            f1.denumerator
        )
    } else { // If not equal
        fractionResult = Fraction(
            ((f1.numerator * f2.denumerator) + (f2.numerator * f1.denumerator)),
            (f1.denumerator * f2.denumerator)
        )
    }
    return fractionResult
}

fun main() {
    // Fractions with denumerators equals
    val f1 = Fraction(1, 5)
    val f2 = Fraction( 3, 5)
    var f3 = addUpFraction(f1, f2)
    println("${f1.numerator}/${f1.denumerator} + ${f2.numerator}/${f2.denumerator} = " +
            "${f3.numerator}/${f3.denumerator}")
    f3 = multiplyFraction(f1, f2)
    println("${f1.numerator}/${f1.denumerator} * ${f2.numerator}/${f2.denumerator} = " +
            "${f3.numerator}/${f3.denumerator}")
    // Fractions with denumerators not equals
    f1.denumerator = 3
    f3 = addUpFraction(f1, f2)
    println("${f1.numerator}/${f1.denumerator} + ${f2.numerator}/${f2.denumerator} = " +
            "${f3.numerator}/${f3.denumerator}")
    f3 = multiplyFraction(f1, f2)
    println("${f1.numerator}/${f1.denumerator} * ${f2.numerator}/${f2.denumerator} = " +
            "${f3.numerator}/${f3.denumerator}")
}

References

  1. How to Add Fractions
  2. How to Multiply Fractions
  3. Data Classes

Upvotes: 0

Related Questions