# 字符串相乘
思路一,使用手算乘法的方式计算(竖式乘法)
代码: AddStrings 是竖式加法。
public static String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
String ans = "0";
for (int i = num2.length() - 1; i >= 0; i--) {
StringBuffer stringBuffer = new StringBuffer();
int count = 0;
for (int j = num2.length() - 1; j > i; j--) {
// 补零
stringBuffer.append(0);
}
int x = num2.charAt(i) - '0';
for (int j = num1.length() - 1; j >= 0; j--) {
int y = num1.charAt(j) - '0';
int carry = x * y + count;
stringBuffer.append(carry % 10);
count = carry / 10;
}
if (count != 0) {
stringBuffer.append(count % 10);
}
ans = AddStrings.addStrings(ans, stringBuffer.reverse().toString());
}
return ans;
}
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
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
优化,不使用竖式加法计算每一层的结果,使用一个数组保存结果。
public static String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
int[] arr = new int[num1.length() + num2.length()];
for (int i = num1.length() - 1; i >= 0; i--) {
int x = num1.charAt(i) - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int y = num2.charAt(j) - '0';
arr[i + j + 1] += x * y;
}
}
for (int i = arr.length - 1; i > 0; i--) {
arr[i - 1] += arr[i] / 10;
arr[i] %= 10;
}
StringBuffer res = new StringBuffer();
int n = arr[0] == 0 ? 1 : 0;
for (int i = n; i < arr.length; i++) {
res.append(arr[i]);
}
return res.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23