LeetCode 分数加减运算 Kotlin
目录
分数加减运算
题目描述
给定一个表示分数加减运算的字符串,返回计算结果。
- 输入、输出字符串只包含
0-9的数字,以及/+-符号(不会有空格) - 输入、输出分数格式均为
(-)分子/分母,正数前面的+会被省略 - 输入只包含合法的最简分数,分子、分母的范围是
[1,10](整数也会用分数来表示) - 输入分数的个数不超过 10 个,最终结果的分子与分母不超过 32 位整数(不会溢出)
- 输出的分数需要是最简分数形式(整数也需要用分数来表示)
题目分析
主要步骤:
- 分割、解析分数
- 计算分母的最小公倍数
- 将分数进行通分
- 计算分子加减运算的结果
- 将计算结果约分
求最小公倍数 & 最大公约数
最大公约数计算公式如下
20 36 -- 16
16 20 -- 4
4 16 -- 0 --> 最大公约数是 4
3 8 -- 5
3 5 -- 2
2 3 -- 1
1 2 -- 0 --> 最大公约数是 1
22 36 -- 14
14 22 -- 8
8 14 -- 6
6 8 -- 2
2 6 -- 0 --> 最大公约数是 2
最小公倍数 = a * b /最大公约数
// 求两个数的最大公约数,Greatest Common Divisor
private fun gcd(a: Int, b: Int): Int {
var (big, small) = if (a > b) a to b else b to a
while (small != 0) {
val temp = small
small = big % small
big = temp
}
return big
}
// 求两个数的最小公倍数,Least Common Multiple
private fun lcm(a: Int, b: Int) = a * b / gcd(a, b)
完整代码
fun fractionAddition(expression: String): String {
val pairs = expression
.replace("-", "+-")
.split("+") // 拆分每个分数
.filter { it.isNotBlank() } // 过滤非法数据
.map { it.split("/") } // 拆分分子分母
.map { Pair(it[0].toInt(), it[1].toInt()) }
val lcm = pairs
.map { it.second } // 分母的集合
.reduce { acc, i -> lcm(acc, i) } // 所有分母的最小公倍数
val sum = pairs
.map { it.first * lcm / it.second } // 分子通分
.reduce { acc, i -> acc + i } // 所有分子相加
val gcd = gcd(kotlin.math.abs(sum), lcm) // 分子和分母的最大公约数
val result = "${sum / gcd}/${lcm / gcd}" // 简化分数
println("lcm: $lcm, sum: $sum, gcd: $gcd, result: $result")
return result
}
// 求两个数的最大公约数,Greatest Common Divisor
private fun gcd(a: Int, b: Int): Int {
var (big, small) = if (a > b) a to b else b to a
while (small != 0) {
val temp = small
small = big % small
big = temp
}
return big
}
// 求两个数的最小公倍数,Least Common Multiple
private fun lcm(a: Int, b: Int) = a * b / gcd(a, b)
2016-11-11
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/6055157.html

浙公网安备 33010602011771号