高精度减法-go
package main
import (
"fmt"
"strconv"
)
func main() {
var num1, num2 string
fmt.Scanf("%s", &num1)
fmt.Scanf("%s", &num2)
sli1, sli2 := make([]int, 0, len(num1)), make([]int, 0, len(num2))
for i := len(num1) - 1; i >= 0; i-- {
num, _ := strconv.Atoi(string(num1[i]))
sli1 = append(sli1, num)
}
for i := len(num2) - 1; i >= 0; i-- {
num, _ := strconv.Atoi(string(num2[i]))
sli2 = append(sli2, num)
}
flag := cmp(sli1, sli2)
if flag == 0 {
fmt.Println(flag)
return
} else if flag == -1 {
sli1, sli2 = sli2, sli1
}
sub(sli1, sli2, flag)
}
func sub(sli1, sli2 []int, flag int){
sli := make([]int, 0, len(sli1))
var add int
for index, num1 := range sli1 {
var num2 int
if index < len(sli2) {
num2 = sli2[index]
}
dif := num1 - num2 + add
if dif < 0 {
dif += 10
add = -1
} else {
add = 0
}
sli = append(sli, dif)
}
delIndex := len(sli)
for i := len(sli) - 1; i >= 0; i-- {
if sli[i] == 0 {
delIndex = i
continue
}
break
}
sli = sli[:delIndex]
sli = rev(sli)
var str string
for index, item := range sli {
if index == 0 && flag == -1 {
str += "-"
}
str += strconv.Itoa(item)
}
fmt.Println(str)
}
func rev(sli []int) []int {
var i int
for i < len(sli)/2 {
sli[i], sli[len(sli)-i-1] = sli[len(sli)-i-1], sli[i]
i++
}
return sli
}
func cmp(sli1, sli2 []int) int {
if len(sli1) > len(sli2) {
return 1
}
if len(sli1) < len(sli2) {
return -1
}
for i := len(sli1) - 1; i >= 0; i-- {
if sli1[i] < sli2[i] {
return -1
} else if sli1[i] > sli2[i] {
return 1
}
}
return 0
}