算法:字符串相乘
?題目描述
給定兩個以字符串形式表示的非負整數 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)//遍歷字符串num2for i := n - 1; i >= 0; i-- {curr := ""//進位add := 0for 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) + curradd = 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) - 1add := 0ans := ""//add 也要判斷for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {x, y := 0, 0if i >= 0 {x = int(num1[i] - '0')}if j >= 0 {y = int(num2[j] - '0')}result := x + y + addans = strconv.Itoa(result % 10) + ansadd = 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] / 10ansArr[i] %= 10}//存儲最終結果ans := ""idx := 0if 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-
總結
- 上一篇: golang输入命令行参数
- 下一篇: 算法:两数相除