原题:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:
思路:
运用ASCII编码将字符转为整数即将整个字符串转为int类型。
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
n1 = self.convert(num1)
n2 = self.convert(num2)
return str(n1 * n2)
def convert(self, num):
n = len(num)
i = 0
val = 0
ord_zero = ord('0')
while i < n:
val = val * 10 + (ord(num[i]) - ord_zero)
i += 1
return val
解法二:
注意,社区有一个C++的解法,思路和这个一样,但是由于C++可以自动对字符进行整数运算,所以那个程序不能直接转化为python程序。因为在C++程序中,字符串中索引为index 的位置的字符的可以替换的,而** python是不可以的** ,因此我将原程序的string类型替换为了list类型,在函数等操作上与C++string差不多(对C++了解不多,勿喷,有错误之处,还望指教)。
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
n1 = len(num1)
n2 = len(num2)
res = []
zeor_num = ord('0')
for i in range(n1 + n2):
res.append('0')
for i in range(n2 - 1, -1, -1):
for j in range(n1 - 1, -1, -1):
temp = (ord(num1[j]) - zeor_num) * (ord(num2[i]) - zeor_num)
+ int(res[i+j+1]) # 得到int类型的temp
res[i + j + 1] = str(temp % 10)
res[i + j] = str(temp // 10
+ int(res[i + j]))
for i in range(n1 + n2):
if res[i] != '0':
return "".join(res[i:])
return '0'
程序二:
下面这个程序是利用字符串类型实现的,与我上面的 list类型不同,想知道在python中如何使用string类型去实现看下面的程序。
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
if num1 == "0" or num2 == "0": #处理特殊情况
return "0"
l1, l2 = len(num1), len(num2)
if l1 < l2:
num1, num2 = num2, num1 #保障num1始终比num2大
l1, l2 = l2, l1
num2 = num2[::-1]
res = "0"
for i, digit in enumerate(num2):
tmp = self.StringMultiplyDigit(num1, int(digit)) + "0" * i #计算num1和num2的当前位的乘积
res = self.StringPlusString(res, tmp) #计算res和tmp的和
return res
def StringMultiplyDigit(self,string, n):
#这个函数的功能是:计算一个字符串和一个整数的乘积,返回字符串
#举例:输入为 "123", 3, 返回"369"
s = string[::-1]
res = []
for i, char in enumerate(s):
num = int(char)
res.append(num * n)
res = self.CarrySolver(res)
res = res[::-1]
return "".join(str(x) for x in res)
def CarrySolver(self, nums):
#这个函数的功能是:将输入的数组中的每一位处理好进位
#举例:输入[15, 27, 12], 返回[5, 8, 4, 1]
i = 0
while i < len(nums):
if nums[i] >= 10:
carrier = nums[i] // 10
if i == len(nums) - 1:
nums.append(carrier)
else:
nums[i + 1] += carrier
nums[i] %= 10
i += 1
return nums
def StringPlusString(self, s1, s2):
#这个函数的功能是:计算两个字符串的和。
#举例:输入为“123”, “456”, 返回为"579"
#PS:LeetCode415题就是要写这个函数
l1, l2 = len(s1), len(s2)
if l1 < l2:
s1, s2 = s2, s1
l1, l2 = l2, l1
s1 = [int(x) for x in s1]
s2 = [int(x) for x in s2]
s1, s2 = s1[::-1], s2[::-1]
for i, digit in enumerate(s2):
s1[i] += s2[i]
s1 = self.CarrySolver(s1)
s1 = s1[::-1]
return "".join(str(x) for x in s1)