看了这文章,我做练习却怎么也调不出来,后来用了chatgpt反复修改,最后得到了下面的结果。验证成功。
【Go语言入门100题】009 N个数求和 (20 分) Go语言|Golang-阿里云开发者社区
https://developer.aliyun.com/article/822842?spm=a2c6h.14164896.0.0.3c3947c5Psx3RG
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
var num int
var str string
// 首先读取分数的数量
_, _ = fmt.Scan(&num)
// 用于存储分子和分母的变量
a, b := 0, 1
// 循环读取并累加每个分数
for i := 0; i < num; i++ {
_, _ = fmt.Scan(&str)
tmp := strings.Split(str, "/")
c, _ := strconv.Atoi(tmp[0])
d := 1
if len(tmp) > 1 {
d, _ = strconv.Atoi(tmp[1]) // 只有在切片长度大于1时才访问tmp[1]
}
gcd := div(b, d) // 最大公约数
lcm := b * d / gcd // 最小公倍数
a = a*(lcm/b) + c*(lcm/d) //通分后分子和
b = lcm
gcd = div(a, b) // 约简分数
if gcd != 0 {
a /= gcd
b /= gcd
}
}
// 输出最终的有理数和
if a%b == 0 {
// 如果可以整除则直接输出
fmt.Println(a / b)
} else if a > b {
// 输出带分数
fmt.Printf("%d %d/%d\n", a/b, a%b, b)
} else {
// 输出真分数
fmt.Printf("%d/%d\n", a, b)
}
}
func div(a, b int) int {
// 最大公约数
for b != 0 {
a, b = b, a%b
}
return a
}