給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2惶岭,返回 num1 和 num2 的乘積示损,它們的乘積也表示為字符串形式渗磅。
示例 1:
輸入: num1 = "2", num2 = "3"
輸出: "6"
示例 2:
輸入: num1 = "123", num2 = "456"
輸出: "56088"
- show the code:
class Solution:
def multiply(self,num1: str, num2: str) -> str:
len1,len2 = len(num1),len(num2)
nums = [0]*(len1+len2)
for i in range(len1-1,-1,-1):
for j in range(len2-1,-1,-1):
nums[i+j+1] += int(num1[i])*int(num2[j])
nums[i+j] += nums[i+j+1]//10
nums[i+j+1] %= 10
k = 0
while k < len(nums) and nums[k] == 0:
k += 1
s = ''.join(str(_) for _ in nums[k:])
return s if s else '0'
- 此題算是一道經(jīng)典題,有關(guān)大數(shù)的題很常見检访,類似的還有大數(shù)相加夺溢,大數(shù)相乘,這些題目都是需要轉(zhuǎn)化成字符串相乘或者字符串相加的運(yùn)算烛谊。此題屬于字符串相乘運(yùn)算振诬,我們需要模擬豎式乘法何址。
- 關(guān)鍵就是要找出規(guī)律:
num1[i] and num2[j]將位于nums[i+j+] and nums[i+j+1]上
也就是說i位置和j位置對(duì)應(yīng)了i+j和i+j+1位置,其次就是注意第i+j+1位保留%10的結(jié)果,但是得記得累加之前的結(jié)果
,第i+j位保留//10的結(jié)果迂求,也得記得累加之前的結(jié)果
,關(guān)鍵體現(xiàn)在這三行語句中:
nums[i+j+1] += int(num1[i])*int(num2[j])
nums[i+j] += nums[i+j+1]//10
nums[i+j+1] %= 10
- 其次需要注意的是我們得到的結(jié)果是一個(gè)列表(python中字符串無法直接修改)所以我們需要將列表轉(zhuǎn)換為字符串,而這個(gè)列表的長(zhǎng)度不一定等于正確結(jié)果的長(zhǎng)度(因?yàn)殚_頭可能有0元素的存在)需要將列表前面的0元素去掉密似,此時(shí)再寫一個(gè)循環(huán),找到列表中第一個(gè)不為0元素位置索引即可葫盼。
-
有關(guān)豎式乘法可以看下面的圖片(話說外國(guó)人原來是這么做乘法的残腌,難怪比我們算得慢,哈哈)
豎式乘法