字符串相乘
题目描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 说明: num1 和 num2 的长度小于110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头,除非是数字 0 本身。 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
class Solution {
public String multiply(String num1, String num2) {
int len1 = num1.length(),len2 = num2.length();
if(len1 == 1 && num1.charAt(0) == '0' || len2 == 1 && num2.charAt(0) == '0'){ // 特殊判断
return "0";
}
if(len1 < len2){ // 标准
String temp = num1;
num1 = num2;
num2 = temp;
len1 = len2^len1;
len2 = len2^len1;
len1 = len2^len1;
}
String sum = "0";
for(int i = len2 - 1 ; i>=0 ; i--){ // 对num2的每个十位数遍历
// 求解积
int carry = 0; // 积进位
String temp = ""; // 每次求积后的临时字符串
for(int j = len1 - 1 ; j>=0 ; j--){ // 对num1的每个十位数遍历
int current = (int)(num2.charAt(i)-'0')*(num1.charAt(j)-'0') + carry;
carry = current/10;
temp = current%10 + temp;
}
if(carry > 0){ // 处理剩余进制问题
temp = carry + temp;
}
// 求解和
for(int k = i ; k<len2-1 ; k++){ // 进十位
temp += "0";
}
String temp1;
if(temp.length() > sum.length()){ // 标准
temp1 = temp;
temp = sum;
sum = temp1;
}
carry = 0;// 和进位
temp1 = "";// 每次求和的临时值
for(int k = 0 ; k<temp.length() ; k++){
int current = (int)(sum.charAt(sum.length() - k - 1)-'0'+temp.charAt(temp.length()- k - 1)-'0') + carry;
carry = current/10;
temp1 = current%10 + temp1;
}
String temp2 = sum.substring(0,sum.length() - temp.length()); // 和前缀
if(carry > 0){ // 处理剩余进制问题
String temp3 = "";
for(int k = temp2.length()-1 ; k>=0 ; k--){
int current = (int)(temp2.charAt(k)-'0') + carry;
carry = current/10;
temp3 = current%10 + temp3;
}
if(carry > 0){ // 处理进制问题
temp3 = carry + temp3;
}
temp1 = temp3 + temp1;
}else{
temp1 = temp2 + temp1;
}
// 更新sum
sum = temp1;
}
return sum;
}
}
模拟手算过程即可,详细请看代码。