leetcode43字符串相乘

leetcode43 Multiply Strings

Posted by BY on August 24, 2019

前言

一个多月没有更新了。

正文

问题来源

本问题来自leetcode上的43题。

问题描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

分析:

参考小学乘法计算过程

func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }
    bnum1 := []byte(num1)
    bnum2 := []byte(num2)
    for i := 0; i < len(bnum1)/2; i++ {
        bnum1[i], bnum1[len(bnum1)-1-i] = bnum1[len(bnum1)-1-i], bnum1[i] 
    }
    for i := 0; i < len(bnum2)/2; i++ {
        bnum2[i], bnum2[len(bnum2)-1-i] = bnum2[len(bnum2)-1-i], bnum2[i]
    }
    bsum := make([]byte, len(bnum1)+len(bnum2))
    for j := 0; j < len(bnum2); j++ {
        var carry byte = 0
        i := 0
        for ; i < len(bnum1); i++ {
            mul := (bnum1[i] - '0') * (bnum2[j] - '0') + bsum[i+j] + carry
            bsum[i+j] = mul % 10
            carry = mul / 10
        }
        if carry != 0 {
            bsum[i+j] += carry
        }
    }
    i := len(bsum) - 1 
    for ; i >= 0; i-- {
        if bsum[i] != 0 {
            break
        }
    }
    for j := 0; j <= i; j++ {
        bsum[j] += '0'
    }
    for j := 0; j < (i+1)/2; j++ {
        bsum[j], bsum[i-j] = bsum[i-j], bsum[j]
    }
    return string(bsum[:i+1])
}

总结:

勤思考。

结语

不管怎么样好好加油。