给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例2:
输入: num1 = "123", num2 = "456"
输出: "56088"
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
二、思路
看到这题的时候就想着直接转换成整数就可以计算了呀,但是题目要求不能这样。那好吧,那我自己制定转换方式不过这样不太好。还是用蠢办法来写吧,直接模仿人类的计算方式来写:
- 按照习惯先计算低位,所以讲两个数组倒过来
- 判断实现是否有进位的情况,如果没有则进行按位相乘,如果有进位则进位数+乘积
- 判断乘积是否大于9,是则进位。
- 将之前计算出来的结果与乘积相加。依旧要判断是否需要进位
- 注意:需要判断最高位是否还有进位的情况。
三、代码
# _*_ coding:utf-8 _*_
'''
@author:xianyt
@date:2018/
@func:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
'''
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
if num1=="0" or num2=="0":
return "0"
result = [0 for i in range(len(num1)-1)]
len_num2 = len(num2)
num1 = num1[::-1]
num2 = num2[::-1]
#处理进位
carry = [0 for i in range(len(num1)+len(num2))]
for l2 in range(len_num2):
i = l2
result.append(0)
for n1 in num1:
if carry[i] != 0:
# 判断之前是否有进位的情况,清空已经处理的进位
result[i] += carry[i]
carry[i] = 0
mul = int(num2[l2])*int(n1)
#判断按位相乘的积是否是个位数
if mul>9:
carry[i+1] += mul//10
result[i] += (mul%10)
# 判断结果是否是个位数
if result[i] > 9:
carry[i+1] += result[i]//10
result[i] = result[i] % 10
i += 1
if carry[len(result)] != 0: #判断最高位是否还有进位
result.append(carry[len(result)])
p = ''.join(str(i) for i in result)
p = p[::-1]
return p
if __name__ == "__main__":
solu = Solution()
print(solu.multiply("2", "3")) #6
print(solu.multiply("723", "10")) #7230
print(solu.multiply("111", "94")) #10434
print(solu.multiply("234", "673")) #157482
print(solu.multiply("234", "73")) #17082
print(solu.multiply("111", "43")) #4773
print(solu.multiply("243", "4")) #97
print(solu.multiply("97", "4773")) #462981