题目
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解法1(正确)
思想:
模拟手工计算的方法,例如:
问题是如何将“369”
、“246”
,“123”
对应到正确的位置,可以使用添加零的方式,在切片中存储“963”
、“0642”
、“00321”
,然后逐位相加即可,有进位的地方存储至prepAdd
,最后将三个切片相加,为了使计算简便,将切片补长至最长的切片,例如“96300”
、“06420”
、“00321”
,相加之后得到的结果为“92151”
,再将其翻转即可。
golang代码:
func multiply(num1 string, num2 string) string {
//若某个数为0,则直接输出为0
if num1 == "0" || num2 == "0" {
return "0"
}
b1 := []byte(num1)
b2 := []byte(num2)
temp := [][]byte(nil)
result := make([]byte, 0)
for i := 0; i <= len(b2)-1; i++ {
prepAdd := 0
temp = append(temp, []byte{
})
//添加0
for k := 0; k < len(b2)-1-i; k++ {
temp[i] = append(temp[i], '0')
}
for j := len(b1) - 1; j >= 0; j-- {
current := int((b2[i]-'0')*(b1[j]-'0')+byte(prepAdd)) % 10
prepAdd = int((b2[i]-'0')*(b1[j]-'0')+byte(prepAdd)) / 10
temp[i] = append(temp[i], byte(current)+'0')
}
//检测是否还有进位
for prepAdd != 0 {
current := int(byte(prepAdd)) % 10
prepAdd = int(byte(prepAdd)) / 10
temp[i] = append(temp[i], byte(current)+'0')
}
//将切片补齐至长度一样
for len(temp[i]) < len(temp[0]) {
temp[i] = append(temp[i], '0')
}
}
//求和计算结果
prepAdd := 0
value := 0
for i := 0; i < len(temp[0]); i++ {
for j := 0; j < len(temp); j++ {
value += int(temp[j][i] - '0')
}
current := (value + prepAdd) % 10
prepAdd = (value + prepAdd) / 10
result = append(result, byte(current)+'0')
value = 0
}
//如果存在进位
for prepAdd != 0 {
current := int(byte(prepAdd)) % 10
prepAdd = int(byte(prepAdd)) / 10
result = append(result, byte(current)+'0')
}
//将结果切片反转
for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
result[i], result[j] = result[j], result[i]
}
return string(result)
}
结果:
执行结果:通过
执行用时:4 ms, 在所有 Go 提交中击败了74.74%的用户
内存消耗:4.4 MB, 在所有 Go 提交中击败了29.65%的用户
官方解答:
转载:https://blog.csdn.net/bestzy6/article/details/117112804
查看评论