- 方法1
将num2中每个数字依次与num1相乘,得到num2.length()个字符串,然后再将这些数字求和即可。
class Solution {
public String multiply(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if(len1==0 || len2 ==0){
return null;
}
if("0".equals(num1) || "0".equals(num2))return "0";
StringBuilder[] sb = new StringBuilder[len2];
for (int k = 0; k< len2; k++) {
sb[k] = new StringBuilder();
}
for(int i=len2-1; i>=0; i--){
int carry = 0;
int index = i;
for(int j=len1-1; j>=0; j--){
while(index<len2-1){
sb[i].append("0");
index++;
}
int ans = (num1.charAt(j)-'0') * (num2.charAt(i)-'0') + carry;
sb[i].append(ans%10);
if(ans/10>0){
carry = ans /10 ;
}else{
carry = 0;
}
}
if(carry != 0){
sb[i].append(carry);
}
}
int maxlen = sb[0].length();
StringBuilder ans = new StringBuilder();
int car = 0;
for(int i=0; i<maxlen; i++){
int res=0;
for(int j=0; j<len2; j++){
if(i < sb[j].length()){
res =res + (sb[j].charAt(i)-'0');
}
}
res+=car;
ans.append(res%10);
if(res/10 > 0){
car = res/10;
}else{
car=0;
}
}
if(car != 0)
ans.append(car);
return ans.reverse().toString();
}
}
- 方法2:
参考下图:
分别计算两个字符串中的每位数字相乘的结果,并利用下标的关系对其结果进行保存,保存在一个总长在num1.length()+num2.length()的数组中。
参考答案区大佬的代码,该方法比较难直接想出来,对进位的处理非常巧妙。
class Solution {
public String multiply(String num1, String num2) {
if(len1==0 || len2 ==0){
return null;
}
if("0".equals(num1) || "0".equals(num2))return "0";
int[] res = new int[num1.length() + num2.length()];
for (int i = num1.length() - 1; i >= 0; i--) {
int n1 = num1.charAt(i) - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int n2 = num2.charAt(j) - '0';
int sum = (res[i + j + 1] + n1 * n2);
res[i + j + 1] = sum % 10;
res[i + j] += sum / 10;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < res.length; i++) {
if (i == 0 && res[i] == 0) continue;
result.append(res[i]);
}
return result.toString();
}
}