如何在Kotlin中实现分数类的乘法与加法运算?
解决Kotlin分数类的乘法与加法实现问题
首先修正你的Fraction类——构造函数里的denumerator没有添加val/var,它只是构造参数而非类属性,类内部无法访问。先把它改为类的私有属性:
class Fraction(private val numerator: Int, private val denumerator: Int) { // 初始化时校验分母不能为0 init { require(denumerator != 0) { "分母不能为0" } } }
接下来实现分数的乘法和加法,推荐用Kotlin的运算符重载,这样可以直接用*和+操作符,更符合直觉:
1. 实现乘法
分数乘法规则:分子相乘作为新分子,分母相乘作为新分母,最后约分。我们需要一个辅助函数计算最大公约数(GCD)来约分。
class Fraction(private val numerator: Int, private val denumerator: Int) { init { require(denumerator != 0) { "分母不能为0" } } // 重载乘法运算符 operator fun times(other: Fraction): Fraction { val newNumerator = this.numerator * other.numerator val newDenominator = this.denumerator * other.denumerator return reduce(newNumerator, newDenominator) } // 约分辅助函数:返回最简分数 private fun reduce(num: Int, den: Int): Fraction { val gcd = gcd(num, den) // 确保分母为正,统一符号 val sign = if (den < 0) -1 else 1 return Fraction(num / gcd * sign, den / gcd * sign) } // 计算最大公约数 private fun gcd(a: Int, b: Int): Int { return if (b == 0) a else gcd(b, a % b) } // 重写toString方便查看结果 override fun toString(): String { return "$numerator/$denumerator" } }
2. 实现加法
分数加法规则:通分后分子相加(num1*den2 + num2*den1),分母为den1*den2,最后约分。
在上面的类中添加加法运算符重载:
// 重载加法运算符 operator fun plus(other: Fraction): Fraction { val newNumerator = this.numerator * other.denumerator + other.numerator * this.denumerator val newDenominator = this.denumerator * other.denumerator return reduce(newNumerator, newDenominator) }
测试用法
fun main() { val f1 = Fraction(1, 6) val f2 = Fraction(3, 6) val product = f1 * f2 println("乘法结果:$product") // 输出 1/12(3/6约分后是1/2,1/6*1/2=1/12) val sum = f1 + f2 println("加法结果:$sum") // 输出 2/3(1/6+3/6=4/6,约分后是2/3) }
补充说明
- 加入了分母非0的校验,避免运行时错误
- 约分函数统一了分母的符号,确保结果格式一致
- 重写
toString方法方便直接打印分数内容
内容的提问来源于stack exchange,提问作者PuzzleHead
相关产品推荐
相关产品推荐

