题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例
输入: num1 = “2”, num2 = “3”
输出: “6”
输入: num1 = “123”, num2 = “456”
输出: “56088”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1
先把每个字符串变为数字,再计算。
Python实现
class Solution:
def multiply(self, num1: str, num2: str) -> str:
sumA,sumB=0,0
for i in range(len(num1)-1,-1,-1):
sumA+=int(num1[i])*10**(len(num1)-1-i)
for j in range(len(num2)-1,-1,-1):
sumB += int(num2[j]) * 10 ** (len(num2) - 1 - j)
return(str(sumA*sumB))
方法2
手动模拟乘法计算
Java实现
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int m = num1.length(), n = num2.length();
// 存储结果
int[] resArr = new int[m + n];
for (int i = m - 1; i >= 0; i--) {
int dig1 = num1.charAt(i) - '0';
for (int j = n - 1; j >= 0; j--) {
int dig2 = num2.charAt(j) - '0';
resArr[i + j + 1] += dig1 * dig2;
}
}
// 进位
for (int i = resArr.length - 1; i > 0; i--) {
resArr[i - 1] += resArr[i] / 10;
resArr[i] = resArr[i] % 10;
}
// 转为字符串
String res = "";
for (int i : resArr) {
res = res + String.valueOf(i);
}
// 判断首位是否为0
if (res.charAt(0) == '0') {
res = res.substring(1, res.length());
}
return res;
}
}
方法3
在手动模拟的基础上优化:
Java实现
⭐ 注意 var [ i + j ]
class Solution {
public String multiply(String num1, String num2) {
//如果有一个数为 0
if (num1.equals("0") || num2.equals("0")) return "0";
int n1 = num1.length(), n2 = num2.length();
//把num1倒置 每个字符转化为int
int[] arr1 = new int[n1];
for (int i = 0; i < n1; i++) arr1[i] = num1.charAt(n1 - i - 1) - '0';
//把num2倒置 每个字符转化为int
int[] arr2 = new int[n2];
for (int i = 0; i < n2; i++) arr2[i] = num2.charAt(n2 - i - 1) - '0';
//运算后的数组var
int len = n1 + n2;
int[] var = new int[len];
Arrays.fill(var, 0);
for (int i = 0; i < n1; i++){
for (int j = 0; j < n2; j++){
var[i + j] += arr1[i] * arr2[j];
}
}
//数组var处理进位
int add = 0;
for (int i = 0; i < var.length; i++){
var[i] += add;
add = var[i] / 10;
var[i] = var[i] % 10;
}
//处理输出结果:去除前导0,变回为字符串
int k = var.length - 1;
StringBuffer sb = new StringBuffer();
while (k >= 0 && var[k] == 0) k--;
while (k >= 0){
sb.append((char)(var[k] + '0'));
k--;
}
return sb.toString();
}
}