LeetCode-Problem 43:大数相乘 -- 转载
https://blog.****.net/kangkanglou/article/details/79894208
给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积。
算法实现
以下是大神的算法,膜拜大神:
首先,长度位m的数乘以长度为n的数的结果不超过m+n。
接下来,我们来看下两数相乘的计算过程,从右向左,将数2中的每一位的数与数1相乘,最后将结果相加。下图演示的是两数相乘的整个过程,从下图中,我们可以得到,对于num[i] *num[j](数1中的第i位数字与数2中的第j位数字相乘的结果只会存放在第【i+j】和【i+j+1】这两位上)
因此,我们实现算法如下:
public static String multiply(String num1, String num2) {
int m = num1.length(), n = num2.length();
int[] pos = new int[m + n];
for (int i = m - 1; i >= 0; i--) {
for (int j = n - 1; j >= 0; j--) {
int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
int p1 = i + j, p2 = i + j + 1;
int sum = mul + pos[p2];
pos[p1] += sum / 10;
pos[p2] = (sum) % 10;
}
}
StringBuilder sb = new StringBuilder();
for (int p : pos) {
if (!(sb.length() == 0 && p == 0)) {
sb.append(p);
}
}
return sb.length() == 0 ? "0" : sb.toString();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
另外,常见的大数相乘算法还有: