Given two non-negative integers num1
and num2
represented as strings, return the product of num1
and num2
.
Note:
- The length of both
num1
andnum2
is < 110. - Both
num1
andnum2
contains only digits0-9
. - Both
num1
andnum2
does not contain any leading zero. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
Start from right to left, perform multiplication on every pair of digits, and add them together. Let's draw the process! From the following draft, we can immediately conclude:
`num1[i] * num2[j]` will be placed at indices `[i + j`, `i + j + 1]`
其实就是累加求和,注意下标位置,P2表示结果中的当前位置,P1表示结果中的进位位置。index中的i、j对应的是自己从左往右的位置,而不是针对结果中的下标位置。
class Solution {
public String multiply(String num1, String num2) {
int m = num1.length();
int n = num2.length();
int[] r = new int[m+n];//m*n最多只能产生m+n位的结果
for(int i=m-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
int p1 = i+j;//p1表示进位
int p2 = i+j+1;//p2表示当前位
int sum = (num1.charAt(i)-'0')*(num2.charAt(j)-'0')+r[p2];//当前位置结果需要累加上之前的结果
r[p2] = sum % 10;//当前的结果
r[p1] = sum /10 + r[p1];//当前运算的进位对上一位的影响
}
}
StringBuilder b = new StringBuilder();
for(int i = 0;i<m+n;i++){
if(!(r[i]==0&&b.length()==0))
b.append(r[i]);
}
return b.length()==0?"0":b.toString();
}
}
复杂度:O(N^2)
另外:
Fast Fourier transform(FFT)。使用FFT可以在O(nlogn)时间内求出多项式的乘法