描述
You will have a list of rationals in the form
lst = [ [numer_1, denom_1] , … , [numer_n, denom_n] ]
or
lst = [ (numer_1, denom_1) , … , (numer_n, denom_n) ]
where all numbers are positive integers. You have to produce their sum N / D in an irreducible form: this means that N and D have only 1 as a common divisor.
分析
方法1:实现分数加法与约分。
分数加法即:
a
1
b
1
+
a
2
b
2
=
a
1
×
b
2
+
a
2
×
b
1
b
1
×
b
2
\frac{a1}{b1}+\frac{a2}{b2}=\frac{a1 \times b2+a2 \times b1}{b1 \times b2}
b1a1+b2a2=b1×b2a1×b2+a2×b1
分数约分即:
a
b
=
a
/
gcd
(
a
,
b
)
b
/
gcd
(
a
,
b
)
\frac{a}{b}=\frac{a/\gcd(a, b)}{b/\gcd(a, b)}
ba=b/gcd(a,b)a/gcd(a,b)
方法2:利用go语言math/big库的分数运算。
实现
方法1:
import "fmt"
func gcd(a, b int) int {
for a % b != 0 { a, b = b, a % b }
return b
}
func fracAdd(a, b []int) []int {
d := a[1] * b[1]
c := a[0] * b[1] + b[0] * a[1]
g := gcd(c, d)
return []int{ c / g, d / g }
}
func SumFracts(arr [][]int) string {
if len(arr) == 0 { return "0" }
r := arr[0]
for i := 1; i < len(arr); i++ {
r = fracAdd(r, arr[i])
}
if r[1] == 1 { return fmt.Sprintf("%d", r[0]) }
return fmt.Sprintf("%d/%d", r[0], r[1])
}
方法2:
import "math/big"
func SumFracts(arr [][]int) string {
result := new(big.Rat).SetFloat64(0)
for _, v := range(arr) {
rat := big.NewRat(int64(v[0]), int64(v[1]))
result.Add(result, rat)
}
return result.RatString()
}