这个问题要求我们模拟两个大整数的乘法运算,而不使用任何内置的大整数库或直接将字符串转换为整数。这实际上是要我们实现一个类似于手算乘法的过程,但用编程语言来表达。
解决思路
-
初始化结果数组:由于两个长度分别为
m
和n
的数字相乘,其结果最多有m + n
位,因此我们可以预先分配一个长度为m + n
的数组result
来存储每一位的结果。 -
逐位相乘:从右向左遍历
num1
和num2
的每一位,计算它们的乘积,并将结果添加到result
数组中相应的位置。注意,num1[i] * num2[j]
的结果应该加到result[i + j + 1]
上(这里假设索引从0开始)。 -
处理进位:在完成所有位的相乘之后,需要从前向后遍历
result
数组,处理每一位上的进位问题,确保每个位置上的值都在 0-9 之间。 -
构建结果字符串:最后,根据
result
数组构建最终的结果字符串。需要注意的是,如果result
数组以 0 开头且长度大于1,则表示结果是 0;否则,去掉前导零并拼接成字符串返回。 -
特殊情况处理:如果任一输入为 “0”,则直接返回 “0”,因为任何数与 0 相乘都是 0。
Python 实现代码
以下是按照上述思路实现的 Python 代码:
def multiply(self, num1: str, num2: str) -> str:
# 特殊情况处理
if num1 == "0" or num2 == "0":
return "0"
m, n = len(num1), len(num2)
result = [0] * (m + n)
# 逐位相乘
for i in range(m - 1, -1, -1):
for j in range(n - 1, -1, -1):
mul = (ord(num1[i]) - ord('0')) * (ord(num2[j]) - ord('0'))
p1, p2 = i + j, i + j + 1
sum_ = mul + result[p2]
result[p2] = sum_ % 10
result[p1] += sum_ // 10
# 构建结果字符串
# 先找到第一个非零元素的位置
i = 0
while i < len(result) and result[i] == 0:
i += 1
# 如果所有都是0,则结果为"0"
if i == len(result):
return "0"
# 拼接从第一个非零元素开始的结果
result_str = ''.join(str(digit) for digit in result[i:])
return result_str
代码解释
-
初始化:创建一个足够大的列表
result
来保存每一位的乘积结果。 -
逐位相乘:通过嵌套循环遍历
num1
和num2
的每一位,计算它们的乘积,并更新result
列表中的对应位置。这里使用了 ASCII 码来将字符转换为对应的数值。 -
处理进位:在计算过程中已经考虑到了进位的问题,即每次计算时都会更新
p1
和p2
位置的值,其中p2
是当前位,而p1
是进位位。 -
构建结果字符串:最后一步是从
result
列表中构建结果字符串,同时去除可能存在的前导零。
这种方法不仅满足了题目要求不使用内置的大整数库或直接转换为整数,而且实现了正确的乘法逻辑,适用于任意长度的非负整数相乘。