演算法:字串相乘
阿新 • • 發佈:2020-12-15
技術標籤:資料結構與演算法
題目描述
給定兩個以字串形式表示的非負整數 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-