题目:给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
-
num1
和num2
的长度小于110。 -
num1
和num2
只包含数字0-9
。 -
num1
和num2
均不以零开头,除非是数字 0 本身。 - 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理
基于竖式乘法,先逐位乘算,再进位相加:
func multiply(num1 string, num2 string) string {
// 有0参与直接返回0
if num1 == "0" || num2 == "0" {
return "0"
}
// 某个为1直接返回另一个
if num1 == "1" {
return num2
}
if num2 == "1" {
return num1
}
// 定义map用于暂存每一位的临时结果
tmp := map[int]rune{}
// 按照逐位相乘,错位相加的思想,遍历计算
i := 0
for _, a := range num1 {
j := 0
for _, b := range num2 {
tmp[i+j] += (a - 48) * (b - 48)
j++
}
i++
}
var (
c rune
res string
)
// 逐位相加后连接字符串
for i := len(tmp) - 1; i >= 0; i-- {
tmp[i] += c
c = tmp[i] / 10
res = string([]rune{tmp[i]%10 + 48}) + res
}
// 将最后一个进位连接上
if c != 0 {
res = string([]rune{c + 48}) + res
}
return res
}
有疑问加站长微信联系(非本文作者)