1. 程式人生 > 其它 >演算法:字串相乘

演算法:字串相乘

技術標籤:資料結構與演算法

題目描述

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。
示例:

輸入: num1 = "2", num2 = "3" 輸出: "6" 輸入: num1 = "123", num2 = "456" 輸出: "56088"

//字串相乘

//做加法 1234 * 567
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    ans := "0"
    m, n := len(num1), len(num2)

    //遍歷字串num2
    for i := n - 1; i >= 0; i-- {
        curr := ""
        //進位
        add := 0

        for j := n - 1; j > i; j-- {
            curr += "0"
        }

        //轉換為整數
        y := int(num2[i] - '0')

        //做乘法
        for j := m - 1; j >= 0; j-- {
            //轉換為整數
            x := int(num1[j] - '0')

            product := x * y + add
            //itoa 整形轉換為字串
            //curr 為對應的每一位數
            curr = strconv.Itoa(product % 10) + curr
            add = product / 10
        }

        //處理最後一個進位
        for ; add != 0; add /= 10 {
            curr = strconv.Itoa(add % 10) + curr
        }

        ans = addStrings(ans, curr)
    }

    return ans
}


func addStrings(num1, num2 string) string {
    i, j := len(num1) - 1, len(num2) - 1
    add := 0
    ans := ""
    //add 也要判斷
    for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {
        x, y := 0, 0
        if i >= 0 {
            x = int(num1[i] - '0')
        }
        if j >= 0 {
            y = int(num2[j] - '0')
        }
        result := x + y + add
        ans = strconv.Itoa(result % 10) + ans
        add = result / 10
    }
    return ans
}


//做乘法
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    m, n := len(num1), len(num2)
    ansArr := make([]int, m + n)

    for i := m - 1; i >= 0; i-- {
        x := int(num1[i]) - '0'
        for j := n - 1; j >= 0; j-- {
            y := int(num2[j] - '0')
            //相乘
            ansArr[i + j + 1] += x * y
        }
    }

    for i := m + n - 1; i > 0; i-- {
        ansArr[i - 1] += ansArr[i] / 10
        ansArr[i] %= 10
    }

    //儲存最終結果
    ans := ""
    idx := 0
    if ansArr[0] == 0 {
        idx = 1
    }
    for ; idx < m + n; idx++ {
        //整形轉換為字串
        ans += strconv.Itoa(ansArr[idx])
    }

    return ans
}

參考連結:https://leetcode-cn.com/problems/multiply-strings/solution/zi-fu-chuan-xiang-cheng-by-