文章目錄
- Golang 解大整數乘法
- 問題描述:LeetCode 43. 字符串相乘
- 思路
- Golang 代碼
Golang 解大整數乘法
在初學 C 語言的時候,我們一定接觸過“字符串相加”或“字符串相乘”之類的問題,對于初學者而言,這類問題的難度一般來說是比較大的(回想起我大一剛剛學習 C 語言時,解決這兩道題的過程非常的痛苦)。
今天我們學習如何使用 Golang 來解決大整數乘法問題,即“字符串相乘”問題。
問題描述:LeetCode 43. 字符串相乘
思路
我們將num1
視為乘數,num2
視為被乘數,字符串相乘的基本思路就是每一次取num2
當中的一位數字,與整個num1
進行相乘,假定num1
的長度是m
,而num2
的長度是n
,那么num2
中的n
個數就需要與num1
進行m * n
次相乘。
由于我們進行的是乘法,從num2
的最后一位開始與num1
進行相乘,當進行到倒數第二位的時候,需要將整個相乘的結果向左移動一位,右側添加一個0
,畢竟在豎式乘法當中就是這樣做的。
最后將每一次相乘得到的結果通過“字符串加法”匯總起來,就可以得到最終“字符串乘法”的結果。
總的來說,這道題目的綜合性非常的強,既考察了在 Golang 當中如何將字符串與數字進行相互轉換,又考察了“字符串乘法”解題模擬的復雜思路。
Golang 代碼
func multiply(num1 string, num2 string) string {// 大整數乘法// num1 是乘數, num2 是被乘數if num1 == "0" || num2 == "0" {return "0"}m, n := len(num1), len(num2)ans := ""for i := n - 1; i >= 0; i -- {// 使用被乘數的每一位與乘數相乘, 然后將每一次乘法得到的結果通過"字符串加法"加在一起curr := ""for j := n - 1; j > i; j -- {curr += "0"}// ?? 每進行一次乘法之后, 與模擬豎式乘法類似, 這一次乘數當中數字與被乘數相乘的結果需要補零y := int(num2[i] - '0')cnt := 0 // 記錄進位for j := m - 1; j >= 0; j -- {x := int(num1[j] - '0')product := x * y + cntcurr = strconv.Itoa(product % 10) + currcnt = product / 10}for cnt > 0 {curr = strconv.Itoa(cnt % 10) + currcnt /= 10}ans = addStrings(ans, curr)}return ans
} func addStrings(num1, num2 string) string {m, n := len(num1), len(num2)ans := ""cnt := 0for i, j := m - 1, n - 1; i >= 0 || j >= 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')}curr := x + y + cntans = strconv.Itoa(curr % 10) + anscnt = curr / 10}for cnt > 0 {ans = strconv.Itoa(cnt % 10) + anscnt /= 10}return ans
}