解题:
- 本题没有什么难的点,看着有点吓人,感觉是代码量比较大。
- 最初用GO写的时候,用bufio读入字符串,发现中间转换起来会非常耗时,期间一直有一个测试点一直超时,最初还以为是分子相乘时导致超过范围引起的,还特意写过一个大数相乘崩溃!!
- 而且代码比较长,后来参考了一篇大神写的代码,给了我很大的启发,其实并不需要用字符串读入,按照正常的fmt.Scanf("%d/%d %d/%d")读入int即可,不要考虑太复杂。
- 重新梳理一遍后,就是正常的"+","-","*","/",可以先把简单的4中情况写完,再去考虑特殊情况,比如分子或分母为0的情况。
- 当然求最大公约数是必须的
package main
import (
"fmt"
)
func gcdx(x, y int) int {
var tmp int
for {
tmp = x % y
if tmp > 0 {
x = y
y = tmp
} else {
return y
}
}
}
func formatPrint(a, b int) {
if b == 0 {
fmt.Print("Inf")
return
}
inegative := 1
if a < 0 {
a *= -1
inegative *= -1
}
if b < 0 {
b *= -1
inegative *= -1
}
gcdd := gcdx(a, b)
a /= gcdd
b /= gcdd
if inegative == -1 {
fmt.Printf("(-")
}
k := a / b
f := a % b
if k > 0 && f > 0 {
fmt.Printf("%d %d/%d", k, f, b)
} else if k == 0 && f > 0 {
fmt.Printf("%d/%d",f, b)
} else {
fmt.Printf("%d", k)
}
if inegative == -1 {
fmt.Printf(")")
}
}
func main() {
var a1, b1, a2, b2 int
_, _ = fmt.Scanf("%d/%d %d/%d", &a1, &b1, &a2, &b2)
var op = [4]byte{'+', '-', '*', '/'}
for i:=0; i<4; i++ {
formatPrint(a1,b1)
fmt.Printf(" %c ", op[i])
formatPrint(a2,b2)
fmt.Printf(" = ")
switch op[i] {
case '+':
formatPrint(a1 * b2 + a2 * b1, b1 * b2)
break
case '-':
formatPrint(a1 * b2 - a2 * b1, b1 * b2)
break
case '*':
formatPrint(a1 * a2, b1 * b2)
break
case '/':
formatPrint(a1 * b2, b1 * a2)
}
fmt.Println()
}
}