字符串相乘

43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

1
2
输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

1
2
输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1num2 只能由数字组成。
  • num1num2 都不包含任何前导零,除了数字0本身。

模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Solution {
public String multiply(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if(num1.equals("0") || num2.equals("0")){
return "0";
}
String res = "0";
int count = 0;
for(int i = len2 - 1; i >= 0; i-- ){
StringBuilder sb = new StringBuilder();
for(int j = 0; j < count; j++){
sb.append("0");
}
count ++;
int x = num2.charAt(i) - '0';
int add = 0;
for(int j = len1 - 1; j >= 0 || add != 0; j--){
int y = j >= 0 ? num1.charAt(j) - '0' : 0;
int sum = x * y + add;
sb.append(sum % 10);
add = sum / 10;
}
String temp = sb.reverse().toString();
System.out.println(temp);
res = addStrings(res, temp);
}
return res;
}


public String addStrings(String num1, String num2) {
if(num1.equals("0")){
return num2;
}
if(num2.equals("0")){
return num1;
}
int i = num1.length()-1;
int j = num2.length()-1;
int add = 0; //进位
StringBuilder ans = new StringBuilder();
while(i >= 0 || j >= 0 || add != 0){
int x = i >= 0? num1.charAt(i) - '0' : 0;
int y = j >= 0? num2.charAt(j) - '0' : 0;
int sum = x + y + add;
add = sum/10;
ans.append(sum % 10);
i--;
j--;
}

return ans.reverse().toString();

}
}

先相乘,后处理进位

image-20240330155331325
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public String multiply(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if(num1.equals("0") || num2.equals("0")){
return "0";
}
int[] value = new int[len1 + len2];

for(int i = len1 - 1; i >= 0; i --){
for(int j = len2 - 1; j >= 0; j --){
value[i + j + 1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}


//处理进位
int add = 0;
for(int i = value.length-1; i >= 0; i--){
value[i] += add;
add = value[i] / 10;
value[i] %= 10;

}

//处理前端的0
StringBuilder sb = new StringBuilder();
int startIndex = 0;
while(startIndex < value.length && value[startIndex] == 0){
startIndex ++;
}
for(int i = startIndex; i < value.length; i++){
sb.append(value[i]);
}
return sb.toString();
}
}

字符串相乘
http://example.com/2023/03/11/算法/字符串/11. 字符串相乘/
作者
PALE13
发布于
2023年3月11日
许可协议