给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
示例 1:
输入: expression = "-1/2+1/2"
输出: "0/1"
示例 2:
输入: expression = "-1/2+1/2+1/3"
输出: "1/3"
示例 3:
输入: expression = "1/3-1/2"
输出: "-1/6"
提示:
输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。
输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。
输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
输入的分数个数范围是 [1,10]。
最终结果的分子与分母保证是 32 位整数范围内的有效整数。
1.byte类型
byte类型是uint8的别名,表示一个字节,
2.rune类型rune类型是Go语言中的一个基本类型,其实就是一个int32的别名,主要用于表示一个字符类型大于一个字节小于等于4个字节的情况下,特别是中文字符。
GO语言"unicode"包中"IsDigit"函数的用法及代码示例。
用法:
func IsDigit(r rune) bool
IsDigit 报告符文是否为十进制数字。
func fractionAddition(expression string) string {
x, y := 0, 1//初始构造的第一个分数
for i, n := 0, len(expression); i < n;{//遍历整个字符串
//读取分子
x1, sign := 0, 1// x1是下一个分数的分子, 默认为0,符号为正数
if expression[i] == '-' || expression[i] == '+'{//如果当前字符是符号位
if expression[i] == '-'{
sign = -1
}
i++//进入下一个位置,为数字
}
//循环:"-1/2+176/2+1/3",读取一个分数的全部分子
for i < n &&unicode.IsDigit(rune(expression[i])){
x1 = x1 * 10 + int(expression[i] - '0')
i++
}
x1 = sign * x1
i++//跳过符号位
//读取分母
y1 := 0
for i < n && unicode.IsDigit(rune(expression[i])){//读取全部分母数
y1 = y1 * 10 + int(expression[i] - '0')
i++
}
//更新算数和
x = x * y1 + x1 * y
y *= y1
}
//分子为0
if x == 0{
return "0/1"
}
//返回最大公因数
g := gcd(abs(x), y)
return fmt.Sprintf("%d/%d", x / g, y / g)
}
func gcd(a, b int) int{
for a != 0{//2, 10
a, b = b % a, a//0,2
}
return b
}
func abs(x int) int{
if x < 0{
return -x
}
return x
}