用面向对象的思想实现一个有理数以及有理数的加减乘除运算——Scala版本

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lockey23/article/details/81513773

有理数

有理数是“数与代数”领域中的重要内容之一,在现实生活中有广泛的应用,是继续学习实数、代数式、方程、不等式、直角坐标系、函数、统计等数学内容以及相关学科知识的基础。数学上,有理数是一个整数a和一个正整数b的比,例如3/8,通则为a/b。0也是有理数。有理数是整数和分数的集合,整数也可看做是分母为一的分数。有理数的小数部分是有限或为无限循环的数。不是有理数的实数称为无理数,即无理数的小数部分是无限不循环的数。

有理数集可以用大写黑正体符号Q代表。但Q并不表示有理数,有理数集与有理数是两个不同的概念。有理数集是元素为全体有理数的集合,而有理数则为有理数集中的所有元素。

直接上代码:

class Rational(a:Int,b:Int){
    require(b!=0)
    private val g = gcd(a.abs,b.abs)//计算分子分母的最大公约数实现约分
    var nm = a/g
    var dm = b/g

    def this(n:Int) = this(n,1)//对于输入单整数的情况,即分母为1
    override def toString = if(dm != 1){ nm +"/"+ dm }else nm.toString()
    //重写toString方法,返回有理数格式的结果

    def +(that:Rational):Rational=//that指代的是传入的被加有理数,以下对于加减乘除都进行了运算符重载,所以每个函数会有两种定义
        new Rational(
        nm*that.dm +that.nm*dm,
        dm*that.dm
        )

    def +(i:Int):Rational =
        new Rational(nm+i*dm,dm)

    def *(that:Rational):Rational=
        new Rational(nm*that.nm,dm*that.dm)

    def *(i:Int):Rational=
        new Rational(i*nm,dm)

    def -(that:Rational):Rational=
        new Rational(
        nm*that.dm -that.nm*dm,dm*that.dm
        )
    def -(i:Int):Rational=
        new Rational(nm-i*dm,dm)

    def /(that:Rational):Rational=
        new Rational(
        nm*that.dm,dm*that.nm
        )
    def /(i:Int):Rational=
        new Rational(nm,dm*i)

    private def gcd(a:Int,b:Int):Int=if(b==0)a else gcd(b,a%b)
}

#以下为测试用例
val x = new Rational(3,8)
println("x = "+x)
val y = new Rational(2)
println("y = "+y)

var z = x+y
println("x + y = "+z)

var o = x*y
println("x * y = "+o)

var xx = x+x*y
println("x + x * y = "+xx)

println("x - y = "+(x-y))

println("x / y = "+x/y)

猜你喜欢

转载自blog.csdn.net/Lockey23/article/details/81513773