43 字符串相乘-中等

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

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

分析:任务拆解,把大任务拆解成一个一个的小任务。

// date 2020/03/28
/*
1. 先实现两个字符串相加;2.实现单个数字的相乘,3.实现零的追加。
*/
func multiply(num1 string, num2 string) string {
    if len(num1) == 0 { return num2 }
    if len(num2) == 0 { return num1 }
    if len(num1) == 1 && num1[0] == '0' { return "0" }
    if len(num2) == 1 && num2[0] == '0' { return "0" }
    var res string
    for i := len(num2)-1; i >= 0; i-- {
        t := product(num1, num2[i])
        t = appendZeros(t, len(num2)-1-i)
        res = addString(res, t)
    }
    return res
}

func appendZeros(s string, c int) string {
    if c <= 0 { return s }
    for c > 0 {
        s += fmt.Sprintf("%d", 0)
        c--
    }
    return s
}

func product(s1 string, s2 byte) string {
    var res string
    var carry, n1, t int
    i, n2 := len(s1)-1, int(s2 - '0')
    for i >= 0 || carry > 0 {
        n1 = 0
        if i >= 0 { n1 = int(s1[i]-'0') }
        t = n1 * n2 + carry
        carry = t / 10
        res = fmt.Sprintf("%d", t%10) + res
        i--
    }
    return res
}

func addString(s1, s2 string) string {
    var res string
    var carry, n1, n2, t int
    i, j := len(s1)-1, len(s2)-1
    for i >= 0 || j >= 0 || carry > 0 {
        n1, n2 = 0, 0
        if i >= 0 { n1 = int(s1[i] - '0') }
        if j >= 0 { n2 = int(s2[j] - '0') } 
        t = n1 + n2 + carry
        carry = t / 10
        res = fmt.Sprintf("%d", t%10) + res
        i--
        j--
    }
    return res
}

最后更新于